Penjelasan sederhana
CASE WHEN adalah versi SQL dari rumus IF di Excel. Kamu menulis beberapa syarat, dan untuk setiap baris database memeriksa syarat dari atas ke bawah. Syarat pertama yang benar menentukan hasilnya, lalu sisanya diabaikan.
ELSE adalah hasil cadangan kalau tidak ada syarat yang cocok. Seluruh blok selalu ditutup dengan END, dan biasanya diberi nama kolom dengan AS.
Sintaks
CASE
WHEN kondisi1 THEN hasil1
WHEN kondisi2 THEN hasil2
ELSE hasil_lain
END
| Bagian | Keterangan |
|---|---|
WHEN ... THEN | Kondisi dan hasilnya. Boleh sebanyak yang dibutuhkan. |
ELSE | Opsional. Hasil jika tidak ada kondisi yang benar. Tanpa ELSE hasilnya NULL. |
END | Wajib, menutup CASE. |
Tanda [kurung siku] berarti bagian opsional. Kata kunci SQL tidak membedakan huruf besar-kecil, tapi menulisnya dengan huruf besar membuat query lebih mudah dibaca.
Contoh CASE WHEN
Data contoh: karyawan
Tabel karyawan
| id | nama | dept_id | kota | gaji | tgl_masuk | atasan_id |
|---|---|---|---|---|---|---|
| 1 | Andi Pratama | 3 | Bandung | 12500000 | 2019-03-11 | NULL |
| 2 | Bunga Lestari | 1 | Jakarta | 9800000 | 2020-07-01 | NULL |
| 3 | Candra Wijaya | 3 | Bandung | 8200000 | 2021-02-15 | 1 |
| 4 | Dewi Anggraini | 2 | Jakarta | 7500000 | 2022-05-09 | 6 |
| 5 | Eko Saputra | 1 | Jakarta | 6900000 | 2023-01-16 | 2 |
| 6 | Fajar Nugroho | 2 | Surabaya | 11000000 | 2018-09-03 | NULL |
| 7 | Gita Permata | 3 | Jakarta | 8200000 | 2023-08-21 | 1 |
| 8 | Hendra Gunawan | NULL | Medan | 5500000 | 2024-04-02 | NULL |
SELECT nama, gaji,
CASE
WHEN gaji >= 10000000 THEN 'Senior'
WHEN gaji >= 8000000 THEN 'Menengah'
ELSE 'Junior'
END AS level
FROM karyawan;
Hasil 8 baris
| nama | gaji | level |
|---|---|---|
| Andi Pratama | 12500000 | Senior |
| Bunga Lestari | 9800000 | Menengah |
| Candra Wijaya | 8200000 | Menengah |
| Dewi Anggraini | 7500000 | Junior |
| Eko Saputra | 6900000 | Junior |
| Fajar Nugroho | 11000000 | Senior |
| Gita Permata | 8200000 | Menengah |
| Hendra Gunawan | 5500000 | Junior |
Setiap karyawan diberi label level berdasarkan gajinya.
Cara kerjanya, langkah demi langkah
FROM karyawan: 8 baris diambil.- Untuk Andi (gaji 12,5 juta): syarat pertama
gaji >= 10000000benar, jadi levelnya Senior. - Untuk Bunga (9,8 juta): syarat pertama salah, syarat kedua
gaji >= 8000000benar, jadi levelnya Menengah. - Untuk Dewi (7,5 juta): kedua syarat salah, jadi masuk
ELSE, yaitu Junior. - Hasilnya kolom baru bernama level di setiap baris.
Dipakai untuk apa di kantor?
- Memberi label segmen pelanggan: Gold, Silver, Bronze.
- Mengubah kode status (1, 2, 3) menjadi teks yang mudah dibaca.
- Menghitung bersyarat dalam satu query, mirip COUNTIF:
SUM(CASE WHEN kota = 'Jakarta' THEN 1 ELSE 0 END).
Kesalahan yang sering terjadi
- Urutan syarat salah. Kalau
gaji >= 8000000ditulis lebih dulu, Andi juga ikut menjadi Menengah, karena syarat itu sudah benar duluan. - Lupa menulis
END, sehingga query error. - Tidak menulis
ELSE. Baris yang tidak cocok dengan syarat mana pun akan bernilai NULL.
COALESCE