CASE Adalah If/Else di SQL
CASE adalah cara memasukkan logika percabangan ke dalam query. Ia memeriksa cabang WHEN secara berurutan, memilih yang pertama cocok, lalu mengembalikan nilai setelah THEN. Kalau tidak ada yang cocok, ia mengembalikan nilai ELSE, atau NULL kalau kamu tidak menulisnya.
Kata pentingnya adalah ekspresi. CASE menghasilkan nilai, jadi ia bisa ditaruh di mana pun sebuah nilai diperbolehkan: kolom SELECT, key ORDER BY, sisi kanan sebuah perbandingan, atau argumen sebuah fungsi.
Itulah bentuk lengkapnya: CASE, satu atau lebih WHEN ... THEN ..., ELSE opsional, lalu END. END wajib ada, dan melupakannya adalah salah ketik yang paling sering terjadi.
Contoh yang Realistis
Misalnya kamu punya tabel pesanan dan ingin memberi label pada setiap baris berdasarkan ukurannya. Buat tabel kecil langsung di query agar kamu bisa menjalankannya:
Cabang diperiksa dari atas ke bawah. Yang pertama cocok yang menang, jadi urutkan dari yang paling spesifik ke yang paling umum. ELSE menangkap semua yang tidak cocok. Tanpa itu, 1200.00 akan dikembalikan sebagai NULL, bukan 'large'.
Searched vs Simple
Yang kamu lihat di atas adalah bentuk searched: setiap WHEN punya kondisi boolean sendiri. Ada bentuk yang lebih pendek kalau kamu membandingkan satu ekspresi dengan beberapa konstanta, yaitu bentuk simple:
Ekspresi setelah CASE dievaluasi sekali dan dibandingkan dengan = terhadap setiap nilai WHEN. Bentuk ini lebih rapi kalau kamu melakukan pencarian kesamaan pada satu kolom.
Satu jebakannya: CASE simple memakai =, dan NULL = NULL tidak bernilai true di SQL. Kalau status bisa bernilai NULL, cabang 'A'/'B'/'C' tidak akan cocok dengannya, sehingga yang terpilih adalah ELSE. Untuk menangani NULL secara eksplisit, ganti ke bentuk searched dan pakai WHEN status IS NULL THEN ....
CASE di ORDER BY
ORDER BY menerima ekspresi apa pun, jadi CASE bisa dipakai di sana. Ini berguna kalau kamu ingin urutan khusus yang tidak sesuai urutan alfabet atau angka:
Secara alfabetis, 'high' < 'low' < 'medium', dan urutan itu tidak berguna untuk menentukan prioritas. Memetakan setiap prioritas ke angka lewat CASE memberimu urutan yang benar-benar kamu inginkan. , id di bagian akhir memecah nilai yang sama secara stabil.
CASE di WHERE
Kamu bisa menaruh CASE di dalam WHERE, tapi sebagian besar waktu kamu tidak membutuhkannya, karena rangkaian AND/OR lebih jelas. Ia unggul kalau kondisinya sendiri bergantung pada nilai lain:
Barang yang sedang diskon lolos kalau harganya di bawah 20, barang biasa kalau di bawah 30. Batasnya sendiri bergantung pada kondisi. Tanpa CASE, kamu harus menulis (on_sale = 1 AND price < 20) OR (on_sale = 0 AND price < 30): hasilnya sama, tapi lebih ramai.
CASE di Dalam Fungsi Agregat
Di sinilah CASE benar-benar berguna. Gabungkan dengan SUM atau COUNT untuk menghitung total dari sebagian baris dalam satu kali penelusuran, padanan SQL untuk "hitung berapa banyak yang cocok":
CASE mengembalikan 1 untuk baris yang cocok dan 0 untuk selebihnya, sehingga SUM menjadi hitungan bersyarat. Trik yang sama berlaku untuk pendapatan: kembalikan total pada baris yang cocok dan 0 di tempat lain. Satu kali memindai tabel, beberapa agregat bersyarat sekaligus.
IIF: Jalan Pintas untuk Dua Cabang
Untuk satu kondisi dengan dua kemungkinan hasil, SQLite punya IIF(cond, when_true, when_false). Fungsi ini murni singkatan dari CASE WHEN cond THEN when_true ELSE when_false END:
Pakai IIF kalau logikanya biner dan lebih enak dibaca dalam satu baris. Ganti ke CASE kalau cabangnya tiga atau lebih, kamu perlu menangani NULL secara terpisah, atau kamu ingin urutan pengecekan bertingkat dari beberapa klausa WHEN.
Jebakan yang Perlu Diketahui
Beberapa hal yang sering menjebak orang:
- Lupa
END.CASEmembuka sebuah blok, danENDmenutupnya. SQLite akan memberimu parse error jauh setelah letak kesalahan sebenarnya. - Tanpa
ELSEberartiNULL. Kalau tidak ada cabangWHENyang cocok dan kamu melewatkanELSE, hasilnyaNULL. Kadang itu yang kamu mau, tapi biasanya tidak. - Urutan cabang itu penting. Pada bentuk searched,
WHENpertama yang cocok yang menang. MenaruhWHEN total < 500sebelumWHEN total < 100berarti cabang kedua tidak akan pernah tercapai. - Mencampur tipe. Setiap cabang bisa mengembalikan tipe yang berbeda, dan SQLite tidak akan protes, tapi kode yang memakai hasilnya mungkin akan bermasalah. Usahakan semua cabang mengembalikan tipe yang cocok satu sama lain (semuanya teks, atau semuanya angka).
CASEsimple danNULL. Seperti sudah disebut: bentuk simple memakai=, yang tidak pernah cocok denganNULL. Pakai bentuk searched kalau ada nilai null.
Berikutnya: Fungsi String
CASE memungkinkanmu membuat percabangan berdasarkan nilai. Bab berikutnya mulai membahas cara mengubah nilai. Fungsi string seperti UPPER, LOWER, SUBSTR, REPLACE, dan pola LIKE menangani pekerjaan sehari-hari membersihkan dan memformat ulang kolom teks. Itu yang berikutnya.
Pertanyaan yang sering diajukan
Apa itu ekspresi CASE di SQLite?
Ekspresi CASE adalah versi if/else di SQL: ia mengevaluasi kondisi lalu mengembalikan sebuah nilai. Ia adalah ekspresi, bukan pernyataan, artinya kamu bisa memakainya di mana pun sebuah nilai diperbolehkan: di SELECT, WHERE, ORDER BY, UPDATE, bahkan di dalam fungsi agregat. Setiap cabang berbentuk WHEN condition THEN value, dengan ELSE opsional di bagian akhir.
Apa bedanya CASE simple dan searched di SQLite?
CASE simple membandingkan satu ekspresi dengan beberapa nilai: CASE status WHEN 'A' THEN ... WHEN 'B' THEN ... END. CASE searched mengevaluasi kondisi boolean tersendiri di setiap cabang: CASE WHEN price > 100 THEN ... WHEN qty = 0 THEN ... END. Bentuk searched lebih fleksibel karena bisa mencampur kolom, operator, dan pengecekan NULL dengan bebas.
Kapan sebaiknya memakai IIF alih-alih CASE di SQLite?
IIF(cond, a, b) adalah singkatan dari CASE WHEN cond THEN a ELSE b END. Pakai IIF untuk logika dua cabang kalau hasilnya lebih mudah dibaca. Pakai CASE kalau cabangnya tiga atau lebih, kamu butuh urutan pengecekan bertingkat, atau perlu menangani NULL secara eksplisit dengan WHEN col IS NULL.