TSQL'de COALESCE İşlevi


109

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:


74

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/


6
Kullanmaya dikkat edin, ISNULLstandart 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 okudum COALESCE.
sprocket12

215

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.


4
+1 Veri türlerinin önceliği hakkındaki açıklamanız için. Ben inanıyorum ISNULLrağmen döner ilk parametre olarak aynı veri türü olan bir değer
Lamak

5
Son kod örneğiniz, 'COALESCE'ye verilen bağımsız değişkenlerden en az biri NULL yazılmalıdır' hatası vermelidir
maqk

2
Belgeler, neredeyse sıfır değer sağlamayı başarırken çok şey söylüyor. İyi belgeler, basit bir sonucu olan basit bir örnek sağlar. Coalesce hemen 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.
P. Brian.Mackey


18

İş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

4

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/


3
Bağlandığınız makale son derece yanıltıcıdır (yazar da dahil olmak üzere birkaç kişi tarafından yorumlar bölümünde belirtildiği gibi). Vurguladığı tüm düzgün hileler TÜM birleştirme yerine ISNULL kullanılarak yapılabilir.
Hobo Spider

3

İş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

  • en az iki argüman alır.
  • bağımsız değişkenler tamsayı türünde olmalıdır.
  • boş olmayan ilk argümanı döndür.

Örneğin

  • coalesce (null, 1, 2, 3) 1 döndürür.
  • coalesce (null, null) null döndürür.

1

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


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
Bunu çok daha basit buldum.
Xiao
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.