CONCAT NULL-поля
-
10-07-2019 - |
Вопрос
У меня есть таблица с тремя полями: Имя, Фамилия и Электронная почта.
Вот некоторые фиктивные данные:
FirstName | LastName | Email
Adam West adam@west.com
Joe Schmoe NULL
Теперь, если я это сделаю:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
Значение Vitals для Джо равно нулю, так как имеется одно пустое поле.Как преодолеть такое поведение?Кроме того, это поведение по умолчанию в MS SQL Server?
Решение
Пытаться
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
вернет то же самое без нулевой проблемы (и пустой строки там, где должны быть нули).
Другие советы
Посмотри на CONCAT_WS
Например:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
Урожайность
TEST STRINGTEST STRING 2
Это проще, чем построить IFNULL
вокруг всего.В качестве разделителя можно использовать пустую строку.
В MySQL не будет работать некоторое время. попробуйте 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
Если вам нужно first < space > last, а просто last, когда first равно null, вы можете сделать это:
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
Я добавил пробел в namename, который мог бы быть нулевым - это означало бы, что пробел выжил бы, только если у FirstName было значение.
Чтобы сложить их все вместе с пробелом между ними:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
Вы всегда можете использовать настройку CONCAT_NULL_YIELDS_NULL
.
просто запустите SET CONCAT_NULL_YIELDS_NULL OFF
, и тогда все null
конкатенации приведут к тексту, а не к нулю.
Ответ Стефана правильный. Чтобы исследовать немного глубже, вам нужно знать, что NULL - это не то же самое, что Nothing. Ноль представляет отсутствие значения или, другими словами, не определено. Ничто не представляет пустую строку, которая на самом деле является значением.
Не определено + что-нибудь = не определено
Хороший кусок базы данных, на котором можно держаться!
Если вы получаете (как я делаю в 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
Нулевые значения неявно преобразуются в пустую строку. Если все аргументы нулевые, возвращается пустая строка типа 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
Если вам нужно обработать NULL
s:
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
В случае MS Access
Вариант 1) SELECT (FirstName + " " + LastName + " " + Email) как Vitals ОТ ЧЛЕНОВ Вы получите пустой результат в случае любого поля с нулевым значением.
Вариант 2) SELECT (FirstName & amp; " " & amp; LastName & amp; " " & amp; E-mail) как жизненно важные от членов Вы получите место вместо поля с нулем.
Изучив ответы на этот вопрос, вы можете объединить их все в одно простое решение
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 проверит, является ли поле NOT NULL
или <=>, поле, содержащее только пробелы или также пустое, например: '', ''), и результат будет либо <=>, либо <=>
IF пропустит поле, если оно не <=> или <=>