Birisi TSQL'deki COALESCE işlevinin nasıl çalıştığını açıklayabilir mi? Sözdizimi aşağıdaki gibidir
KÖMÜR (x, y)
Bu işlevle ilgili MSDN belgesi oldukça belirsiz
Birisi TSQL'deki COALESCE işlevinin nasıl çalıştığını açıklayabilir mi? Sözdizimi aşağıdaki gibidir
KÖMÜR (x, y)
Bu işlevle ilgili MSDN belgesi oldukça belirsiz
Yanıtlar:
COALESCE'nin ISNULL'dan daha az maliyetli olduğu söylendi, ancak araştırmalar bunu göstermiyor. ISNULL yalnızca iki parametre alır; alan NULL için değerlendirilir ve NULL olarak değerlendirilirse istediğiniz sonuç. COALESCE herhangi bir sayıda parametre alır ve NULL olmayan ilk karşılaşılan değeri döndürür.
Ayrıntıların çok daha kapsamlı bir açıklaması burada http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
Belgelerin neden belirsiz olduğunu düşündüğünden emin değilim.
Basitçe tüm parametreleri tek tek geçer ve ilk olanı döndürür 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
Hemen hemen her sayıda parametreyi kabul eder, ancak aynı veri türünde olmaları gerekir. (Aynı veri türünde değillerse, veri türü öncelik sırasını kullanarak örtük olarak uygun bir veri türüne dönüştürülürler .)
Bu ISNULL()
, sadece iki yerine birden çok parametreye benzer .
Aynı zamanda ANSI-SQL
, ISNULL()
olmadığı yerde.
ISNULL
rağmen döner ilk parametre olarak aynı veri türü olan bir değer
expressions
, CASE ile karşılaştırmalar, ISNULL ile karşılaştırmalar ve son olarak sonuçsuz bir örneğe geçer. Sonra çok fazla ayrıntı içeren aşırı karmaşık bir örnek. İhtiyacımız olan tek şey 5-6 satır WTF ile bu cevap olduğunda, bu şeydir ve yapar.
İşte COALESCE'ye bakış açım ... ve umarım mantıklı geliyor ...
Basit bir biçimde….
Coalesce (AlanAdı, 'Boş')
Yani bu şu anlama gelir… "AlanAdı" NULL ise, alan değerini "BOŞ" kelimesiyle doldurun.
Şimdi çoklu değerler için ...
Coalesce (AlanAdı1, AlanAdı2, Değer2, Değer3)
Alanadı1'deki değer boşsa, Alanadı2'deki değerle doldurun, AlanAdı2 NULL ise, Değer2 ile doldurun, vb.
AdventureWorks2012 örnek veritabanı için bu test kodu parçası mükemmel çalışıyor ve COALESCE'in nasıl çalıştığına dair iyi bir görsel açıklama sunuyor :
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
ISNULL yerine geçmekten çok daha fazlası var. Birleşmenin resmi "belgelerinin" belirsiz ve faydasız olduğuna tamamen katılıyorum. Bu makale çok yardımcı oluyor. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
İşte birleştirme içeren basit bir sorgu -
select * from person where coalesce(addressId, ContactId) is null.
Hem addressId hem de contactId'nin boş olduğu kişileri döndürür.
birleştirme işlevi
Örneğin
Coalesce () işlevinin en basit tanımı şöyle olabilir:
Coalesce () işlevi, aktarılan tüm bağımsız değişkenleri değerlendirir ve ardından NULL olarak değerlendirilmeyen bağımsız değişkenin ilk örneğinin değerini döndürür.
Not: TÜM parametreleri değerlendirir, yani döndürülen / NOT NULL parametresinin sağ tarafındaki bağımsız değişken (ler) in değerlendirmesini atlamaz.
Sözdizimi:
Coalesce(arg1, arg2, argN...)
Dikkat : NULL olarak değerlendirilen bağımsız değişkenlerin yanı sıra, diğer tüm (NOT-NULL) bağımsız değişkenler aynı veri türünde olmalı veya eşleşen türlerde olmalıdır (uyumlu bir veri türüne "dolaylı olarak otomatik dönüştürülebilir"), örneklere bakın altında:
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
standart değil, daha az esnek, her zaman ilk argümanın veri türünü döndüreceğini ve döndürülen değerin veri türünü döndürmeyeceğini okudumCOALESCE
.