Soal 1Manakah berikut ini yang dengan benar menjelaskan ORDER BY CASE WHEN city = 'Tokyo' THEN 1 WHEN city = 'Osaka' THEN 2 ELSE 9 END?
Fungsi ⑥ — CASE dalam Praktik — ORDER BY / UPDATE / NULL
Artikel keenam dari fungsi SQL. Menetapkan urutan sembarang dengan ORDER BY CASE, update massal bersyarat dengan UPDATE ~ SET kolom = CASE, dan menangani CASE dengan NULL — pada data staff dan customer dari CSV.
Data yang Dipakai di Artikel Ini — staff dan customer
CASE yang dipelajari sejauh ini adalah ekspresi serbaguna yang bisa kamu tempatkan tidak hanya di daftar kolom SELECT tetapi juga di dalam `ORDER BY` dan di klausa SET `UPDATE`. Artikel ini menelusuri dua penerapan itu dan jebakan menangani NULL dengan CASE secara berurutan.
Subjeknya adalah tabel staff (10 staff) di paruh pertama dan tabel customer (8 customer / memuat NULL) di paruh kedua. Paruh pertama mengurutkan city ke urutan sembarang; paruh kedua memakai CASE yang menampilkan email NULL sebagai "Not registered", dan akhirnya menjalankan UPDATE CASE yang menulis ulang nilai country menjadi kategori wilayah.
Memakai CASE di ORDER BY — Menetapkan Urutan Sembarang
Sisi kanan ORDER BY bisa memuat bukan hanya nama kolom tetapi juga ekspresi CASE. Dengan ini kamu bisa menetapkan urutan sembarang yang tidak bisa dihasilkan urutan alfabet string atau ukuran numerik. Pakai untuk prioritas bisnis seperti "Tokyo → Osaka → Kyoto → lainnya", urutan status seperti "Open → In progress → Done", atau pengurutan rank.
Tulis sebagai ORDER BY CASE WHEN cond THEN angka ... ELSE angka END — CASE mengembalikan sebuah angka untuk sorting dan kamu mengurutkan berdasarkan angka itu. ASC / DESC bisa ditempelkan persis seperti pada kolom. Baris dengan angka sama diurutkan berdasarkan kolom ORDER BY berikutnya (dipisah koma), jadi mengkombinasikan sort key + secondary key juga menentukan urutan dalam sebuah kategori.
-- 1) Urutkan city dengan urutan 'Osaka → Kyoto → Tokyo → lainnya'
SELECT name, city, salary FROM staff
ORDER BY
CASE city
WHEN 'Osaka' THEN 1
WHEN 'Kyoto' THEN 2
WHEN 'Tokyo' THEN 3
ELSE 9
END,
salary DESC; -- dalam city yang sama, salary tertinggi dulu
-- 2) ORDER BY CASE + DESC juga bisa membalik urutan
-- jika CASE menetapkan 1, 2, 3, maka DESC mengurutkannya 3, 2, 1
Jebakan CASE + NULL — Pakai `IS NULL`, Bukan `= NULL`
Sama seperti di WHERE, `= NULL` / `<> NULL` juga tidak bisa dipakai di dalam CASE. Perbandingan dengan NULL selalu menghasilkan NULL (unknown), dan ketika sebuah klausa CASE WHEN mengembalikan NULL percabangan itu tidak diambil, jadi hasilnya berbeda dari yang kamu maksudkan.
Untuk menguji NULL, pakai `kolom IS NULL` / `kolom IS NOT NULL`. Ini aturan yang sama dengan cek NULL WHERE yang dipelajari sebelumnya, dan ini berlaku di mana pun sebuah kondisi bisa ditulis — CASE / IIF / WHERE / ON. Bentuk simple (CASE kolom WHEN ... THEN) tidak bisa menguji NULL, jadi saat kamu perlu menangani NULL selalu pakai bentuk searched (CASE WHEN kolom IS NULL THEN ...).
-- Salah: WHEN NULL tidak bisa memilih baris NULL ('Unknown' tak pernah muncul)
SELECT name, age,
CASE age
WHEN NULL THEN 'Unknown'
ELSE age
END AS age_display
FROM customer;
-- Benar: bentuk searched + IS NULL
SELECT name, age,
CASE
WHEN age IS NULL THEN 'Unknown'
ELSE age
END AS age_display
FROM customer;
-- Catatan: COALESCE(age, 'Unknown') memberi hasil yang sama
-- untuk penggantian NULL 2 nilai sederhana, COALESCE lebih pendek
Memakai CASE di UPDATE — Tulis Ulang Nilai Berdasarkan Kondisi
Sejauh ini CASE menghasilkan kolom baru di sisi baca, tetapi menulis CASE di klausa SET UPDATE membuat kamu bisa menulis ulang nilai kolom aktual di tabel berdasarkan kondisi.
Tulis sebagai UPDATE tabel SET kolom = CASE WHEN cond THEN nilai1 WHEN cond THEN nilai2 ... ELSE kolom END. Menulis ELSE kolom untuk mengatakan "baris yang tidak cocok WHEN mana pun mempertahankan nilai aslinya" adalah cara yang aman; lupa itu dan ELSE dianggap NULL, menimpa baris non-target dengan NULL.
Karena UPDATE adalah operasi destruktif yang mengubah tabel aktual, artikel ini menanganinya di latihan terakhir. Sebelum menjalankannya, praktik produksi standar adalah mencoba kondisi yang sama dengan SELECT name, kolom, CASE ..., memverifikasi hasilnya secara visual, dan menulis ulangnya sebagai UPDATE hanya jika terlihat benar.
-- Verifikasi dulu dengan SELECT (bermaksud menjadikan age NULL menjadi 0)
SELECT name, age,
CASE
WHEN age IS NULL THEN 0
ELSE age
END AS new_age
FROM customer;
-- Jika terlihat benar, tulis ulang sebagai UPDATE
UPDATE customer SET age = CASE
WHEN age IS NULL THEN 0
ELSE age
END;
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Manakah berikut ini cara yang benar menangani NULL dengan CASE?
Soal 3Dalam UPDATE customer SET country = CASE WHEN country IN ('Japan') THEN 'Asia' WHEN country IS NULL THEN 'Unknown' ELSE country END;, apa alasan terbaik menulis `ELSE country`?