Конкатенация со значениями NULL в SQL - PullRequest
16 голосов
/ 23 ноября 2011
Column1      Column2
-------      -------
 apple        juice
 water        melon
 banana
 red          berry       

У меня есть таблица с двумя столбцами.Column1 имеет группу слов, а Column2 также имеет группу слов.Я хочу объединить их с оператором + без пробела.

Например: applejuice

Дело в том, что если во втором столбце есть нулевое значение, я хочу иметь только первоеэлемент в результате.

Например: banana

Result
------
applejuice
watermelon
banana
redberry

Однако, когда я использую column1 + column2, он дает значение NULL, если Comunm2 равен NULL.Я хочу получить "банан" в результате.

Ответы [ 8 ]

37 голосов
/ 23 ноября 2011

Используйте функцию COALESCE, чтобы заменить значения NULL пустой строкой.

SELECT Column1 + COALESCE(Column2, '') AS Result
    FROM YourTable
1 голос
/ 23 ноября 2011

Вы можете сделать union:

(SELECT Column1 + Column2 FROM Table1 WHERE Column2 is not NULL)
UNION
(SELECT Column1 FROM Table1 WHERE Column2 is NULL);
0 голосов
/ 09 июля 2019

Несколько постов, помеченных мной как MSSQL, были переименованы в 'SQL' модератором.Поэтому я предполагаю, что вы используете MSSQL

COALESCE вернет ПЕРВОЕ ненулевое значение.

SELECT COALESCE('a', NULL, 'c')

вернет только 'a'

Если вы хотите Firstname +Фамилия, где иногда один или другой имеет значение NULL, используйте CONCAT.Concat добавляет строки вместе и заменяет NULLS ненулевым значением длины 0.

 SELECT CONCAT('a', NULL, 'c')

вернет 'ac'

Если вы хотите, чтобы Fn пробел + пробел среднего имени + LN, объедините concatinateс CONCAT:

SELECT CONCAT('a' + ' ', NULL + ' ', 'c')

Возвращает 'a c'.

Пробел после среднего имени (null) удаляется с помощью + и NULL.

NULL + ''имеет значение null.

Таким образом, в случаях, когда Middlename или Firstname имеют значение NULL, вы не получите лишних нежелательных пробелов.

0 голосов
/ 14 апреля 2017

Вы можете использовать условие случая:

case when column_2 is not null 
     then concatenate
     else column_1
end
0 голосов
/ 23 ноября 2011

Если вы используете MySq, используйте ifnull (Column2, '')

0 голосов
/ 23 ноября 2011

Стандартный SQL требует, чтобы конкатенация строк с использованием NULL генерировала выходные данные NULL, но они записывались с использованием операции ||:

SELECT a || b
  FROM SomeTable;

Выход будет нулевым, если a или b или оба содержат NULL.

Использование + для объединения строк означает, что вы используете расширение, специфичное для СУБД. Поведение может быть таким же, как того требует стандарт, - действительно, в этом и заключается суть вашего вопроса.

Некоторые СУБД, в частности Oracle, склонны рассматривать пустые строки как эквивалентные пустым; тогда вы можете весело объединить. Однако такое поведение не является строго совместимым со стандартом, если используется оператор ||.

Подумайте об использовании COALESCE, NVL, IFNULL или какой-либо подобной функции, чтобы отобразить NULL в пустую строку перед объединением.

0 голосов
/ 23 ноября 2011

Знак + для конкатенации в TSQL по умолчанию объединяет строку + ноль в ноль в качестве неизвестного значения.

Вы можете сделать одну из двух вещей, вы можете изменить эту переменную для сеанса, которая управляет тем, что Sql должен делать с пустыми значениями

http://msdn.microsoft.com/en-us/library/ms176056.aspx

Или вы можете объединить каждуюстолбец в пустую строку перед объединением.

COALESCE(Column1, '')

http://msdn.microsoft.com/en-us/library/ms190349.aspx

0 голосов
/ 23 ноября 2011

Я не уверен, что вы используете в качестве своей базы данных, но я бы искал "объединяющую" функцию для вашего конкретного диалекта SQL и использовал бы ее.

...