Функция 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 ответов:
Попробуйте
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