Функция 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 58

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)

SQL Server не имеет

в случае 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