Объединить значения NULL в SQL

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

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

Например: applejuice

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

Например: banana

Result
------
applejuice
watermelon
banana
redberry

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

Ответ 1

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

SELECT Column1 + COALESCE(Column2, '') AS Result
    FROM YourTable

Ответ 2

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

(SELECT Column1 + Column2 FROM Table1 WHERE Column2 is not NULL)
UNION
(SELECT Column1 FROM Table1 WHERE Column2 is NULL);

Ответ 3

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

Ответ 4

Знак + для конкатенации в 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

Ответ 5

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

SELECT a || b
  FROM SomeTable;

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

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

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

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

Ответ 6

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

Ответ 7

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

case when column_2 is not null 
     then concatenate
     else column_1
end

Ответ 8

Несколько сообщений, которые я сделал с пометкой 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, вы не получите лишних лишних пробелов.