Fungsi COALESCE di TSQL

109

Adakah yang bisa menjelaskan bagaimana fungsi COALESCE di TSQL bekerja? Sintaksnya adalah sebagai berikut

COALESCE (x, y)

Dokumen MSDN tentang fungsi ini cukup kabur

Lloyd Banks
sumber

Jawaban:

74

Saya telah diberitahu bahwa COALESCE lebih murah daripada ISNULL, tetapi penelitian tidak menunjukkan itu. ISNULL hanya membutuhkan dua parameter, bidang yang dievaluasi untuk NULL, dan hasil yang Anda inginkan jika dievaluasi sebagai NULL. COALESCE akan mengambil sejumlah parameter, dan mengembalikan nilai pertama yang ditemukan, bukan NULL.

Ada deskripsi yang jauh lebih menyeluruh tentang detailnya di sini http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/

Bill Melius
sumber
6
Berhati-hatilah dalam menggunakan ISNULL, ini bukan standar, kurang fleksibel, saya membaca bahwa itu akan selalu mengembalikan tipe data dari argumen pertama dan bukan tipe data dari nilai yang dikembalikan seperti COALESCEhalnya.
sproket 12
215

Saya tidak yakin mengapa menurut Anda dokumentasinya tidak jelas.

Ini hanya melewati semua parameter satu per satu, dan mengembalikan yang pertama 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

Ini menerima hampir semua jumlah parameter, tetapi mereka harus tipe data yang sama. (Jika mereka bukan tipe data yang sama, mereka secara implisit ditransmisikan ke tipe data yang sesuai menggunakan urutan prioritas tipe data .)

Ini seperti ISNULL()tetapi untuk beberapa parameter, bukan hanya dua.

Itu juga ANSI-SQL, di mana ISNULL()tidak.

MatBailie
sumber
4
+1 Untuk penjelasan Anda tentang jenis data diutamakan. Saya percaya itu ISNULLmengembalikan nilai dengan tipe data yang sama dengan parameter pertama, meskipun
Lamak
5
Contoh kode terakhir Anda harus memberikan kesalahan 'Setidaknya salah satu argumen untuk COALESCE harus berupa NULL yang diketik' Sumber: sql-server-performance.com/2007/…
maqk
2
Dokumentasi mengatakan banyak hal sambil juga mengelola untuk memberikan nilai yang hampir nol. Dokumen yang bagus memberikan contoh sederhana dengan hasil yang sederhana. Coalesce segera berpindah ke expressions, perbandingan dengan CASE, perbandingan dengan ISNULL, dan terakhir contoh tanpa hasil. Kemudian contoh yang terlalu rumit dengan terlalu banyak detail. Ketika yang kita butuhkan hanyalah jawaban ini dengan 5 - 6 baris WTF, ini adalah dan melakukan.
P. Brian.Mackey
18

Inilah cara saya memandang COALESCE ... dan semoga masuk akal ...

Dalam bentuk yang sederhana….

Coalesce (FieldName, 'Empty')

Jadi ini diterjemahkan menjadi… Jika "FieldName" adalah NULL, isi nilai bidang dengan kata "KOSONG".

Sekarang untuk nilai mutliple ...

Menggabungkan (FieldName1, FieldName2, Value2, Value3)

Jika nilai di Fieldname1 adalah null, isi dengan nilai di Fieldname2, jika FieldName2 adalah NULL, isi dengan Value2, dll.

Kode tes untuk database sampel AdventureWorks2012 ini bekerja dengan sempurna & memberikan penjelasan visual yang baik tentang cara kerja COALESCE :

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
John Waclawski
sumber
4

Ada lebih banyak hal untuk digabungkan dari sekedar pengganti ISNULL. Saya sepenuhnya setuju bahwa "dokumentasi" resmi penggabungan tidak jelas dan tidak membantu. Artikel ini sangat membantu. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/

CindyPsych
sumber
3
Artikel yang Anda tautkan itu sangat menyesatkan (seperti yang ditunjukkan oleh beberapa orang, termasuk penulisnya, di bagian komentar). Semua trik rapi yang dia soroti SEMUA dapat dilakukan menggunakan ISNULL sebagai pengganti penggabungan.
Hobo Spider
3

Berikut adalah kueri sederhana yang berisi penggabungan -

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

Ini akan mengembalikan orang di mana addressId dan contactId adalah null.

fungsi penggabungan

  • membutuhkan setidaknya dua argumen.
  • argumen harus berjenis integer.
  • mengembalikan argumen bukan nol pertama.

misalnya

  • coalesce (null, 1, 2, 3) akan mengembalikan 1.
  • coalesce (null, null) akan mengembalikan null.
Neeraj Bansal
sumber
1

Definisi paling sederhana dari fungsi Coalesce () bisa jadi:

Fungsi Coalesce () mengevaluasi semua argumen yang diteruskan kemudian mengembalikan nilai instance pertama dari argumen yang tidak mengevaluasi ke NULL.

Catatan: ini mengevaluasi SEMUA parameter, yaitu tidak melewatkan evaluasi argumen di sisi kanan parameter yang dikembalikan / NOT NULL.

Sintaksis:

Coalesce(arg1, arg2, argN...)

Hati-hati : Terlepas dari argumen yang mengevaluasi ke NULL, semua argumen (NOT-NULL) lainnya harus dari tipe data yang sama atau harus dari tipe yang cocok (yang dapat "secara implisit diubah secara otomatis" menjadi tipe data yang kompatibel), lihat contoh di bawah:

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

Eddie Kumar
sumber
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
Xiao
sumber
1
Saya menemukan yang ini jauh lebih sederhana.
Xiao