Подтвердить что ты не робот

CONCAT'ing NULL полей

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

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

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

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

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

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

4b9b3361

Ответ 1

Try

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).

Ответ 2

Посмотрите CONCAT_WS

Например:

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

Урожайность

TEST STRINGTEST STRING 2

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

Ответ 3

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

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

Ответ 4

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

Если вам нужно сначала < пробел > последнее, а просто последнее, когда оно имеет значение null, вы можете сделать это:

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Undefined + anything = undefined

Хороший лабиринт для хранения данных!

Ответ 7

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

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

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

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

Ответ 8

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

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

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

SELECT FirstName + LastName + Email as Vitals FROM MEMBERS

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

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

Ответ 9

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

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

поэтому достаточно использовать CONCAT без IsNull

CONCAT(FirstName, LastName, Email)

Ответ 10

В случае MS Access

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

Вариант 2) SELECT (FirstName и "и LastName и" " и Email) как Vitals FROM MEMBERS Вы получите Space вместо поля с нулевым значением.

Ответ 11

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

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

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

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

IF Выведет поле, если оно не NULL или EMPTY