COALESCE Функція в TSQL


109

Чи може хтось пояснити, як працює функція COALESCE в TSQL? Синтаксис такий

КАЛЕЦІЯ (x, y)

Документ MSDN щодо цієї функції досить розпливчастий

Відповіді:


74

Мені сказали, що КОАЛЕСС коштує дешевше, ніж ІСНУЛЬНО, але дослідження цього не свідчать. ISNULL приймає лише два параметри, поле оцінюється як NULL, а результат, який потрібно, якщо він оцінюється як NULL. COALESCE візьме будь-яку кількість параметрів і поверне перше зібране значення, яке не є NULL.

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


6
Остерігайтеся використання ISNULL, його нестандартного, менш гнучкого, я читав, що він буде повертати тип даних першого аргументу завжди, а не тип даних повернутого значення, як COALESCEце робиться.
зірочка12

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()ні.


4
+1 Для вашого пояснення щодо пріоритетності типів даних. Я вважаю, що ISNULLповертає значення з тим самим
типом

5
Ваш останній приклад коду повинен містити помилку 'Принаймні один з аргументів COALESCE повинен бути набраним NULL' Джерело: sql-server-performance.com/2007/…
maqk

2
Документація багато говорить, в той же час вдається забезпечити майже нульове значення. Хороші документи надають простий приклад з простим результатом. Coalesce негайно переходить до expressions, порівняння з CASE, порівняння з ISNULL і, нарешті, приклад без результату. Тоді надмірно складний приклад із занадто великою кількістю деталей. Коли нам потрібно лише ця відповідь з 5 - 6 рядків WTF, ця річ є і є.
P.Brian.Mackey


18

Ось як я дивлюся на COALESCE ... і, сподіваюся, це має сенс ...

У спрощеній формі….

Coalesce (FieldName, 'Empty')

Отже, це означає "Якщо" FieldName "є NULL, заповніть значення поля словом" EMPTY ".

Тепер для взаємних значень ...

Coalesce (FieldName1, FieldName2, Value2, Value3)

Якщо значення в Fieldname1 є нульовим, заповніть його значенням у Fieldname2, якщо FieldName2 - NULL, заповніть його Value2 тощо.

Цей фрагмент тестового коду для зразкової бази даних AdventureWorks2012 прекрасно працює і дає хороше візуальне пояснення того, як працює COALESCE :

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product

4

Є набагато більше для злиття, ніж просто заміна ISNULL. Я повністю погоджуюся з тим, що офіційна "документація" злиття є розпливчастою і непотрібною. Ця стаття дуже допомагає. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/


3
Ця стаття, з якою ви пов’язані, є надзвичайно оманливою (на що вказують декілька людей, включаючи автора, у розділі коментарів). Всі акуратні трюки, які він виділяє, ВСІ можна виконати, використовуючи ISNULL замість згуртованого.
Hobo Spider

3

Ось простий запит, що містить coalesce -

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

Він поверне осіб, де і addressId, і contactId недійсні.

злиття функції

  • бере щонайменше два аргументи.
  • аргументи повинні бути цілим типом.
  • повернути перший ненульовий аргумент.

напр

  • coalesce (null, 1, 2, 3) повернеться 1.
  • coalesce (null, null) поверне null.

1

Найпростішим визначенням функції Coalesce () може бути:

Функція Coalesce () оцінює всі передані аргументи, потім повертає значення першої інстанції аргументу, що не оцінюється, до NULL.

Примітка: вона оцінює ВСІ параметри, тобто не пропускає оцінку аргументу (аргументів) у правій частині повернутого параметра / НЕ 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.

HTH


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
Я знайшов цей набагато простіше.
Сяо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.