Чи може хтось пояснити, як працює функція COALESCE в TSQL? Синтаксис такий
КАЛЕЦІЯ (x, y)
Документ MSDN щодо цієї функції досить розпливчастий
Чи може хтось пояснити, як працює функція COALESCE в TSQL? Синтаксис такий
КАЛЕЦІЯ (x, y)
Документ MSDN щодо цієї функції досить розпливчастий
Відповіді:
Мені сказали, що КОАЛЕСС коштує дешевше, ніж ІСНУЛЬНО, але дослідження цього не свідчать. ISNULL приймає лише два параметри, поле оцінюється як NULL, а результат, який потрібно, якщо він оцінюється як NULL. COALESCE візьме будь-яку кількість параметрів і поверне перше зібране значення, яке не є NULL.
Тут є набагато більш ретельний опис деталей http://www.mssqltips.com/sqlservertip/2689/deciding-bet between-coalesce-and-isnull-in-sql- server/
Я не впевнений, чому ви вважаєте, що документація розпливчаста.
Він просто проходить всі параметри один за одним і повертає перший, який є 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()
ні.
ISNULL
повертає значення з тим самим
expressions
, порівняння з CASE, порівняння з ISNULL і, нарешті, приклад без результату. Тоді надмірно складний приклад із занадто великою кількістю деталей. Коли нам потрібно лише ця відповідь з 5 - 6 рядків WTF, ця річ є і є.
Ось як я дивлюся на 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
Є набагато більше для злиття, ніж просто заміна ISNULL. Я повністю погоджуюся з тим, що офіційна "документація" злиття є розпливчастою і непотрібною. Ця стаття дуже допомагає. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
Ось простий запит, що містить coalesce -
select * from person where coalesce(addressId, ContactId) is null.
Він поверне осіб, де і addressId, і contactId недійсні.
злиття функції
напр
Найпростішим визначенням функції 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
ISNULL
, його нестандартного, менш гнучкого, я читав, що він буде повертати тип даних першого аргументу завжди, а не тип даних повернутого значення, якCOALESCE
це робиться.