Функция concat вычислить значение null поля



У меня есть таблица с тремя полями: FirstName, LastName и Email.

Вот некоторые фиктивные данные:

FirstName | LastName | Email
Adam        West       [email protected]
Joe         Schmoe     NULL

Теперь, если я это сделаю:

SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS

Значение Vitals для Джо равно нулю, так как существует одно нулевое поле. Как вы преодолеваете это поведение? Кроме того, это поведение по умолчанию в MS SQL Server?

11   58  

11 ответов:

Попробуйте

ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL

Итак,

CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL

Вернет то же самое без проблемы null (и пустой строки, где должны быть null).

Посмотрите на CONCAT_WS

Например:

CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")

Выходы

TEST STRINGTEST STRING 2

Это проще, чем строить IFNULL вокруг всего. В качестве разделителя можно использовать пустую строку.

В mysql isnull некоторое время не будет работать. попробуйте IFNULL (),

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS

Рекомендуется, но если вы действительно подсели на CONCAT, оберните его в {fn }, и вы можете использовать функцию ODBC, такую как:

SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS

Если вам нужен первый последний, но только последний, когда первый равен нулю, вы можете сделать это:

ISNULL(FirstName+' ','') + ISNULL(LastName,'')

Я добавил пробел на firstname, который может быть равен null - это будет означать, что пробел сохранится только в том случае, если FirstName имеет значение.

Чтобы сложить их все вместе с пробелом между ними:

RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))

Вы всегда можете использовать параметр CONCAT_NULL_YIELDS_NULL..

Просто запустите SET CONCAT_NULL_YIELDS_NULL OFF , и тогда все null конкатенации приведут к тексту, а не к нулю..

Ответ Стефана верен. Чтобы исследовать немного глубже, вам нужно знать, что NULL-это не то же самое, что ничто. Null означает отсутствие значения или, другими словами, не определено. Ничто не представляет собой пустую строку, которая на самом деле является значением.

Неопределенный + что угодно = неопределенный

Хорошая база данных лакомый кусочек, чтобы держаться!

Если вы получаете (как я делаю в MySQL):

#1582 - Incorrect parameter count in the call to native function 'ISNULL'

Можно заменить функцию ISNULL на COALESCE:

CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))

Начиная с MS SQL Server 2012 была введена функция CONCAT и согласно MSDN

Значения Null неявно преобразуются в пустую строку. Если все это аргументы равны нулю, возвращается пустая строка типа varchar(1).

Так что достаточно использовать CONCAT без IsNull

CONCAT(FirstName, LastName, Email)

SQL Server не имеет функции CONCAT.
(Обновление: начиная с MS SQL Server 2012 была введена функция CONCAT)

В поведении SQL Server по умолчанию значения null распространяются через выражение.

В SQL Server можно было бы написать:

SELECT FirstName + LastName + Email as Vitals FROM MEMBERS

Если вам нужно обработать NULLs:

SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS

В случае MS Access

Вариант 1) Выберите (FirstName + ""+ LastName + "" + Email) в качестве жизненно важных параметров от участников Вы получите пустой результат в случае любого поля с null.

Вариант 2) выбираем (Имя & ""& Фамилия & "" & по электронной почте), а показатели из членов Вы получите пробел вместо поля с нулем.

После просмотра ответов на этот вопрос, вы можете объединить их все в одно простое решение

CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))

Итак, , короче говоря, мы используем CONCAT_WS для объединения наших полей и разделения их с ,; и обратите внимание, что NULL поля ни EMPTY не объединяются

NULLIF проверяет, является ли поле NULL или EMPTY, поле, которое содержит только пробелы или также пусто, например:",' '), и вывод будет либо NULL, либо NOT NULL

Если Будет ли выставлено поле, если это не NULL или EMPTY

Comments

    No results found.