Функция concat вычислить значение null поля
у меня есть таблица с тремя полями: FirstName, LastName и Email.
вот некоторые фиктивные данные:
FirstName | LastName | Email
Adam West adam@west.com
Joe Schmoe NULL
теперь, если я это сделаю:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
Vitals для Joe равно null, так как существует одно нулевое поле. Как вы преодолеваете это поведение? Кроме того, это поведение по умолчанию в 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-это не то же самое, что Nothing. Null представляет собой отсутствие значения или, другими словами, не определено. Ничто не представляет пустую строку, которая на самом деле является значением.
Undefined + anything = undefined
хорошая база данных лакомый кусочек, чтобы держаться!
Если вы получаете (как я делаю в 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 неявно преобразуются в пустую строку. Если все аргументы равны null, возвращается пустая строка типа varchar(1).
этого достаточно, чтобы использовать конкатенацию без функции isnull
CONCAT(FirstName, LastName, Email)
в случае MS Access
Вариант 1) Выберите (FirstName + ""+ LastName + "" + Email) в качестве жизненно важных данных от участников Вы получите пустой результат в случае любого поля с null.
Вариант 2) выбираем (Имя & ""& Фамилия & "" & по электронной почте), а показатели из членов Вы получите пространство вместо поля с null.
после наблюдения ответов на этот вопрос, вы можете объединить все из них в одно простое решение
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