Вопрос

У меня есть таблица с тремя полями: Имя, Фамилия и Электронная почта.

Вот некоторые фиктивные данные:

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 пропустит поле, если оно не <=> или <=>

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top