Объединение со значениями NULL в SQL

Column1      Column2
-------      -------
 apple        juice
 water        melon
 banana
 red          berry       

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

Например: яблочный сок

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

Например: банан

Result
------
applejuice
watermelon
banana
redberry

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


person LuckySlevin    schedule 22.11.2011    source источник
comment
Это касается не только строк, которые я нашел. Я не знаю, является ли это наиболее эффективным, но вы всегда можете заключить столбцы в оператор isNull. то есть: isNull (column1, '') + isNull (column2, '') то, что он должен сделать, это когда он найдет null, он заменит его пустой строкой. Я не тестировал это, поэтому дайте мне знать, работает ли оно.   -  person Chris Santiago    schedule 23.11.2011
comment
Возможный дубликат конкатенации строки SQL Server с нулевым значением   -  person Michael Freidgeim    schedule 10.03.2016


Ответы (8)


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

SELECT Column1 + COALESCE(Column2, '') AS Result
    FROM YourTable
person Joe Stefanelli    schedule 22.11.2011

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

SELECT a || b
  FROM SomeTable;

Результатом будет NULL, если a или b или оба содержат NULL.

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

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

Рассмотрите возможность использования COALESCE, NVL или IFNULL или другой подобной функции для сопоставления NULL с пустой строкой перед объединением.

person Jonathan Leffler    schedule 22.11.2011

Несколько сообщений, которые я написал с тегами MSSQL, были переименованы модератором в «SQL». Итак, я предполагаю, что вы используете MSSQL

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

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

вернет только "а"

Если вам нужно имя + фамилия, где иногда одно или другое значение равно ПУСТО (NULL), используйте CONCAT. Concat складывает строки вместе и заменяет NULLS ненулевым значением длины 0.

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

вернет 'ac'

Если вам нужно пространство Fn + пространство отчество + LN, объедините concatinate с CONCAT:

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

Вернет «а с».

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

NULL + '' равно нулю.

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

person Client Relations    schedule 09.07.2019
comment
Это потрясающе! Мне пришлось сделать RTRIM (LTRIM (x)) для полей, а затем я сделал оператор case, чтобы проверить, был ли последний символ конкатенации тем разделителем, который я использовал (;), чтобы я мог удалить его, на случай, если в конце был еще один. - person missscripty; 10.11.2020

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

person CapelliC    schedule 22.11.2011

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

(SELECT Column1 + Column2 FROM Table1 WHERE Column2 is not NULL)
UNION
(SELECT Column1 FROM Table1 WHERE Column2 is NULL);
person Chris Cooper    schedule 22.11.2011

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

person Chris E    schedule 22.11.2011

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

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

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

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

COALESCE(Column1, '')

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

person Chris    schedule 22.11.2011

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

case when column_2 is not null 
     then concatenate
     else column_1
end
person harsh    schedule 13.04.2017
comment
это не добавляет ничего полезного к остальным 6 существующим ответам - person Adam; 14.04.2017
comment
@ Адам, на самом деле никто еще не предложил выражение case в качестве решения. Думаю, ваша оценка может быть слишком резкой. - person trincot; 14.04.2017