Adakah yang bisa menjelaskan bagaimana fungsi COALESCE di TSQL bekerja? Sintaksnya adalah sebagai berikut
COALESCE (x, y)
Dokumen MSDN tentang fungsi ini cukup kabur
Adakah yang bisa menjelaskan bagaimana fungsi COALESCE di TSQL bekerja? Sintaksnya adalah sebagai berikut
COALESCE (x, y)
Dokumen MSDN tentang fungsi ini cukup kabur
Jawaban:
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/
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.
ISNULL
mengembalikan nilai dengan tipe data yang sama dengan parameter pertama, meskipun
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.
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
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/
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
misalnya
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
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 sepertiCOALESCE
halnya.