case versus isnull versus coalesce

9

Saya baru saja membaca dokumentasi untuk ujian SQL Server 2012 dan saya melihat poin berikut:

case versus isnull versus coalesce

Sekarang, saya tahu BAGAIMANA untuk menggunakan masing-masing tetapi saya tidak tahu KAPAN menggunakan masing-masing. Tolong bisakah seseorang mengklarifikasi. Terima kasih.

Ps. Tolong bisakah kita memiliki tanda untuk pertanyaan ujian?

Stuart Blackler
sumber
2
COALESCEdiperluas ke CASEtetapi jelas dalam CASEpernyataan yang Anda tulis sendiri Anda bisa lebih fleksibel dalam WHENkondisi. Untuk ISNULLvs COALESCE terkait / duplikat?
Martin Smith
terkait saya setuju. tapi tidak dup. Terima kasih atas komentarnya :)
Stuart Blackler

Jawaban:

10

ISNULL - hanya tersedia di SQL Server. Mengizinkan pengujian dan penggantian nilai NULL dengan satu sama lain.

COALESCE - standar ANSI. Mengizinkan pengujian dan penggantian nilai NULL dengan nilai non-nol pertama dalam serangkaian panjang variabel. Penting untuk dicatat bahwa faktor-faktor prioritas tipe data menjadi hal ini

-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1) 
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')

Dalam contoh di atas, 'a' adalah nilai non-nol pertama tetapi data karakter memiliki prioritas lebih rendah daripada integer.

Pertimbangan lain antara ISNULL vs COALESCE adalah resultan dari ISNULL yang ditentukan untuk TIDAK NULL sedangkan hasil dari panggilan COALESCE adalah NULLable. Lihat posting JRJ ISNULL () <> COALESCE () Meskipun itu mungkin hal yang sepele, pengoptimal kueri dapat membuat rencana yang berbeda berdasarkan pada ketidakmungkinan kolom.

Anda dapat dengan mudah menguji nullability ekspresi isnull / coalesce / case Anda dengan menjalankannya melalui dmo sys.dm_exec_describe_first_result_set

-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
    DMO.*
FROM
    sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO

CASE - Juga fungsi skalar standar ANSI. Saya akan melihat menggunakan CASE selama dua sebelumnya ketika saya memiliki tes yang tidak dapat diungkapkan dalam skalar sederhana tapi itu jawaban yang cukup lemah, saya akui.

billinkc
sumber
Terima kasih atas jawaban lengkapnya dengan cepat. Saya tidak tahu bahwa urutan diutamakan COALESCE. Terima kasih lagi
Stuart Blackler
1
CASEsecara teknis adalah ekspresi, bukan fungsi.
ypercubeᵀᴹ
1

ISNULL memberi Anda kemungkinan untuk mengembalikan 1 repalcement, COALESCE tidak terbatas pada satu Nilai mis. COALESCE(v1,v2,v3,v4,v5) Jika V5 adalah satu-satunya Nilai yang BUKAN NULL itu akan dikembalikan

bummi
sumber