Di SQL Server, COALESCE() ekspresi mengembalikan argumen non-null pertamanya.
Cara kerjanya adalah, kami meneruskan daftar argumen ke ekspresi, mengevaluasi argumen secara berurutan dan mengembalikan nilai saat ini dari ekspresi pertama yang awalnya tidak mengevaluasi ke NULL .
Sintaks
Sintaksnya seperti ini:
COALESCE ( expression [ ,...n ] ) Contoh
Berikut adalah contoh sederhana untuk ditunjukkan:
SELECT COALESCE(null, 'Cat', 'Dog'); Hasil:
Cat
Dalam hal ini, Cat adalah argumen non-NULL pertama, jadi COALESCE() mengembalikan nilai tersebut.
Ekspresi
Seperti disebutkan, COALESCE() mengembalikan nilai saat ini dari ekspresi pertama yang awalnya tidak dievaluasi ke NULL . Oleh karena itu, jika kita memberikan ekspresi seperti ini:
SELECT COALESCE( null, 2 * 3 ); Kami mendapatkan ini:
6
Fungsi mengembalikan tipe data ekspresi dengan prioritas tipe data tertinggi. Jika semua ekspresi tidak dapat dibatalkan, hasilnya akan diketik sebagai tidak dapat dibatalkan.
Ketika Semua Argumen NULL
Jika semua argumen adalah NULL , COALESCE() mengembalikan NULL . Namun, setidaknya satu dari nilai nol harus diketik NULL , jika tidak akan terjadi kesalahan.
Dengan kata lain, tidak semuanya bisa menjadi NULL konstan:
SELECT COALESCE( null, null ); Kami mendapatkan ini:
Msg 4127, Level 16, State 1, Line 1 At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
Dalam hal ini, semua argumen adalah NULL konstan, dan kesalahan dikembalikan.
Di bawah ini adalah contoh database untuk mendemonstrasikan skenario di mana COALESCE() mengembalikan NULL ketika semua argumen adalah NULL .
Misalkan kita menjalankan kueri berikut:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Hasil:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Kedua kolom berisi NULL nilai.
Jadi jika kita meneruskan kedua kolom ke COALESCE() , kita mendapatkan hasil dari NULL :
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Hasil:
NULL
Hal yang sama berlaku jika kita mengganti salah satu kolom dengan NULL konstan:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Hasil:
NULL
Jadi hanya ketika semua argumennya adalah NULL konstan sehingga kita mendapatkan kesalahan.
Ganti NULL Hasil dengan Nilai yang Diketahui
Kami dapat menyertakan nilai yang diketahui sebagai argumen terakhir untuk mengganti hasil NULL apa pun dengan nilai yang diketahui itu.
Misalnya, kueri berikut mengembalikan NULL :
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals; Hasil:
NULL
Dalam hal ini, UnitPrice kolom berisi nilai NULL di semua baris, dan hasilnya adalah NULL .
Kita bisa menggunakan COALESCE() seperti ini:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals; Hasil:
0.00
Sekarang, hasil NULL diganti dengan nilai yang diketahui (nol).
COALESCE() vs CASE
COALESCE() ekspresi sebenarnya adalah pintasan sintaksis untuk CASE ekspresi. Saat kita menggunakan COALESCE() ekspresi, pengoptimal kueri menulis ulang sebagai CASE ekspresi.
Ketika saya menjalankan pernyataan berikut:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Pengoptimal kueri menulis ulang sebagai berikut:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END COALESCE() vs ISNULL()
Dalam beberapa hal, COALESCE() ekspresinya mirip dengan ISNULL() fungsi. Tapi ada perbedaan. Khususnya:
ISNULL()adalah fungsi dan dievaluasi hanya sekali.COALESCE()di sisi lain, adalah ekspresi, dan berpotensi dapat dievaluasi beberapa kali.- Penentuan tipe data dari ekspresi yang dihasilkan berbeda.
ISNULLmenggunakan tipe data parameter pertama,COALESCEmengikutiCASEaturan ekspresi dan mengembalikan tipe data nilai dengan prioritas tertinggi. - Kemampuan NULL dari ekspresi hasil berbeda untuk
ISNULLdanCOALESCE.ISNULLnilai kembalian selalu dianggap NOT NULLable (dengan asumsi nilai kembalian adalah non-nullable). Sebaliknya,COALESCEdengan parameter non-null dianggapNULL. - Validasi untuk
ISNULLdanCOALESCEjuga berbeda. Misalnya,NULLnilai untukISNULLdiubah menjadiintmeskipun untukCOALESCE, Anda harus memberikan tipe data. ISNULLhanya membutuhkan dua parameter. SebaliknyaCOALESCEmengambil sejumlah variabel parameter.
Informasi Lebih Lanjut
Lihat dokumentasi Microsoft untuk detail lebih lanjut dan contoh yang lebih kompleks.