ОБЪЕДИНЯЯ пустые поля - PullRequest
59 голосов
/ 24 июня 2009

У меня есть таблица с тремя полями: FirstName, LastName и Email.

Вот несколько фиктивных данных:

FirstName | LastName | Email
Adam        West       adam@west.com
Joe         Schmoe     NULL

Теперь, если я сделаю:

SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS

Виталий для Джо - ноль, так как есть одно нулевое поле. Как вы преодолеваете это поведение? Кроме того, это поведение по умолчанию в MS SQL Server?

Ответы [ 11 ]

118 голосов
/ 24 июня 2009

Попробуйте

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

вернул бы то же самое без нулевой проблемы (и пустой строки, где должны быть нулевые значения).

67 голосов
/ 26 апреля 2011

Посмотрите на CONCAT_WS

Например:

CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")

Урожайность

TEST STRINGTEST STRING 2

Это проще, чем строить IFNULL вокруг всего. Вы можете использовать пустую строку в качестве разделителя.

12 голосов
/ 25 марта 2011

В MySQL не будет работать некоторое время. попробуй IFNULL (),

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
6 голосов
/ 24 июня 2009
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 равно null, вы можете сделать это:

ISNULL(FirstName+' ','') + ISNULL(LastName,'')

Я добавил пробел в namename, который мог бы быть нулем - это означало бы, что пробел выжил бы, только если FirstName имел значение.

Чтобы сложить их все вместе с пробелом между ними:

RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
5 голосов
/ 24 июня 2009

Вы всегда можете использовать настройку CONCAT_NULL_YIELDS_NULL ..

просто запустите SET CONCAT_NULL_YIELDS_NULL OFF, и тогда все null конкатенации приведут к тексту, а не к нулю.

3 голосов
/ 19 июля 2013

Если вы получаете (как я в MySQL):

#1582 - Incorrect parameter count in the call to native function 'ISNULL'

Вы можете заменить функцию ISNULL на COALESCE:

CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
3 голосов
/ 24 июня 2009

Ответ Стефана правильный. Чтобы исследовать немного глубже, вам нужно знать, что NULL - это не то же самое, что Nothing. Ноль представляет отсутствие значения или, другими словами, не определено. Ничто не представляет пустую строку, которая на самом деле является значением.

Не определено + что-нибудь = не определено

Хороший тайтбит базы данных!

2 голосов
/ 05 мая 2016

Начиная с MS SQL Server 2012 была введена функция CONCAT и в соответствии с MSDN

Нулевые значения неявно преобразуются в пустую строку. Если все аргументы нулевые, возвращается пустая строка типа varchar (1).

так что достаточно использовать CONCAT без IsNull

CONCAT(FirstName, LastName, Email)
2 голосов
/ 24 июня 2009

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
1 голос
/ 21 ноября 2013

В случае MS Access

Вариант 1) ВЫБРАТЬ (FirstName + "" + LastName + "" + Email) как Vitals ОТ ЧЛЕНОВ Вы получите пустой результат в случае любого поля со значением NULL.

Вариант 2) ВЫБЕРИТЕ (FirstName & "" & LastName & "" & Email) как Vitals ОТ ЧЛЕНОВ Вы получите место вместо поля с нулем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...