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?
Ответы
Ответ 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