Функция COALESCE в TSQL

109

Может кто-нибудь объяснить, как работает функция COALESCE в TSQL? Синтаксис следующий

КОАЛЕС (x, y)

Документ MSDN по этой функции довольно расплывчатый

Ллойд Бэнкс
источник

Ответы:

74

Мне сказали, что COALESCE дешевле, чем ISNULL, но исследования этого не показывают. ISNULL принимает только два параметра: поле, оцениваемое как NULL, и желаемый результат, если он оценивается как NULL. COALESCE примет любое количество параметров и вернет первое встреченное значение, отличное от NULL.

Здесь гораздо более подробное описание деталей http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/

Билл Мелиус
источник
6
Остерегайтесь использования ISNULL, это нестандартно, менее гибко, я читал, что он всегда будет возвращать тип данных первого аргумента, а не тип данных возвращаемого значения, как это COALESCEделает.
sprocket12
215

Я не уверен, почему вы думаете, что документация расплывчата.

Он просто просматривает все параметры один за другим и возвращает первый из них NOT NULL.

COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1


COALESCE(1, 2, 3, 4, 5, NULL)
=> 1


COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3


COALESCE(6, 5, 4, 3, 2, NULL)
=> 6


COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL

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

Это похоже ISNULL()на несколько параметров, а не только на два.

Это также ANSI-SQL, где-как ISNULL()нет.

MatBailie
источник
4
+1 За ваше объяснение о приоритете типов данных. Я считаю, что это ISNULLвозвращает значение с тем же типом данных, что и первый параметр,
Ламак,
5
Последний пример кода должен выдавать ошибку «По крайней мере, один из аргументов COALESCE должен быть типизированным NULL» Источник: sql-server-performance.com/2007/…
maqk
2
Документация говорит о многом, но при этом обеспечивает практически нулевую ценность. Хорошая документация предоставляет простой пример с простым результатом. Сразу же переходит Coalesce expressions, сравнение с CASE, сравнение с ISNULL и, наконец, пример без результата. Затем чрезмерно сложный пример со слишком большим количеством деталей. Когда все, что нам нужно, это ответ с 5-6 строками WTF, эта штука есть и делает.
P.Brian.Mackey
1
Подробная информация о приоритете типов данных (Transact-SQL) - TechNet - Microsoft
IsmailS
18

Вот как я смотрю на COALESCE ... и, надеюсь, это имеет смысл ...

В упрощенной форме….

Coalesce (Имя поля, 'Пусто')

Таким образом, это означает… Если «FieldName» равно NULL, заполните значение поля словом «EMPTY».

Теперь о различных ценностях ...

Объединить (ИмяПоля1, ИмяПоля2, Значение2, Значение3)

Если значение в Fieldname1 равно null, заполните его значением в Fieldname2, если FieldName2 равно NULL, заполните его значением Value2 и т. Д.

Этот фрагмент тестового кода для образца базы данных AdventureWorks2012 отлично работает и дает хорошее визуальное объяснение того, как работает COALESCE :

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
Джон Вацлавски
источник
4

Объединить нужно гораздо больше, чем просто замену ISNULL. Я полностью согласен с тем, что официальная «документация» coalesce расплывчата и бесполезна. Эта статья очень помогает. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/

СиндиПсих
источник
3
Эта статья, на которую вы ссылаетесь, является крайне вводящей в заблуждение (как было указано несколькими людьми, включая автора, в разделе комментариев). Все изящные трюки, которые он выделяет, ВСЕ могут быть выполнены с использованием ISNULL вместо coalesce.
Hobo Spider
3

Вот простой запрос, содержащий coalesce -

select * from person where coalesce(addressId, ContactId) is null.

Он вернет людей, у которых и addressId, и contactId равны null.

функция слияния

  • требует минимум два аргумента.
  • аргументы должны быть целочисленного типа.
  • вернуть первый ненулевой аргумент.

например

  • coalesce (null, 1, 2, 3) вернет 1.
  • coalesce (null, null) вернет null.
Нирадж Бансал
источник
1

Самое простое определение функции Coalesce () может быть таким:

Функция Coalesce () оценивает все переданные аргументы, а затем возвращает значение первого экземпляра аргумента, который не был оценен как NULL.

Примечание: он оценивает ВСЕ параметры, т.е. не пропускает оценку аргумента (ов) с правой стороны возвращаемого параметра / NOT NULL.

Синтаксис:

Coalesce(arg1, arg2, argN...)

Осторожно : кроме аргументов, которые оцениваются как NULL, все остальные (NOT-NULL) аргументы должны иметь один и тот же тип данных или должны иметь совпадающие типы (которые могут быть «неявно автоматически преобразованы» в совместимый тип данных), см. Примеры ниже:

PRINT COALESCE(NULL, ('str-'+'1'), 'x')  --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3)    --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99)      --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.

DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31')  --returns today's date, works fine as implicit conversion into DATE type occurs.

--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str')      --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.

--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt)      --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.

НТН

Эдди Кумар
источник
0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str
Сяо
источник
1
Я обнаружил, что этот намного проще.
Сяо