Banyak orang tahu dan menggunakan fungsi bawaan ISNULL (X, Y), yang menggantikan argumen pertama dengan yang kedua jika itu adalah (pertama) NULL. Yang kurang umum digunakan adalah fungsi built-in terbalik NULLIF (X, Y), yang mengembalikan NULL jika argumen pertama sama dengan yang kedua. Kombinasi kedua fungsi ini menghindari penggunaan konstruksi IF-ELSE atau CASE-WHEN, yang membuat kode lebih kompak. Jika Anda tertarik untuk melihat beberapa contoh, selamat datang di kucing.
Sebagai contoh, berikut adalah kode yang menghasilkan 10 bilangan bulat acak dalam rentang dari 1 hingga 37, dan nilai terdekat yang sama dengan atau lebih besar dari angka yang ditampilkan adalah kelipatan dari 6.
SELECT Q.Src, CASE WHEN Q.Src % 6 = 0 THEN Q.Src ELSE Q.Src + (6 - Q.Src % 6) END AS NextTimes6 FROM ( SELECT TOP 10 CONVERT(INT, 1 + 37 * RAND(CHECKSUM(NEWID()))) Src FROM SYSOBJECTS S ) Q
Anda dapat menghilangkan KASUS..Ketika melakukan trik berikut - membalikkan NULL hasil dari Q.Src% 6 jika sisanya adalah 0, mengetahui bahwa hasil dari operasi apa pun dengan NULL adalah NULL, dan kemudian mengembalikan NULL kembali ke 0 dengan fungsi eksternal ISNULL:
SELECT Q.Src, Q.Src + ISNULL(6 - NULLIF(Q.Src % 6, 0), 0) AS NextTimes6 FROM ( SELECT TOP 10 CONVERT(INT, 1 + 37 * RAND(CHECKSUM(NEWID()))) Src FROM SYSOBJECTS S ) Q
Contoh lain adalah membagi string menjadi dua bagian dengan spasi (misalnya, nama dari string Nama <spasi> Nama keluarga. Masalah khas di sini saat menyelesaikan "head on" adalah fungsi KIRI terhempas saat meneruskannya dengan argumen -1 sebagai nilai jumlah karakter yang akan dipotong dalam kasus ketika tidak ada ruang di baris sumber (CHARINDEX mengembalikan 0):
SELECT Q.Src, CASE WHEN CHARINDEX(' ', Q.Src) > 0 THEN LEFT(Q.Src, CHARINDEX(' ', Q.Src) - 1) ELSE Q.Src END AS NameOnly FROM ( SELECT N' ' AS Src UNION ALL SELECT N'' ) Q
Berubah menjadi:
SELECT Q.Src, LEFT(Q.Src, ISNULL(NULLIF(CHARINDEX(' ', Q.Src), 0) - 1, LEN(Q.Src))) AS NameOnly FROM ( SELECT N' ' AS Src UNION ALL SELECT N'' ) Q
Nikmati pemrograman SQL!