Belajar dengan membaca secara berurutan

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.

Sebelum latihan, mari pastikan definisi kolom dan sampel data dari dua tabel yang dipakai di sini — staff dan customer.

① Pakai PRAGMA table_info(staff); dan PRAGMA table_info(customer); untuk memeriksa definisi kolom kedua tabel.

② Pakai SELECT * FROM staff LIMIT 5; dan SELECT * FROM customer LIMIT 5; untuk melihat pratinjau 5 baris pertama.

SQL Editor

Jalankan query untuk melihat hasil

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.

ORDER BY CASE — Menetapkan Urutan Sembarang
cityangka dari CASEurutan sortTokyo1ke-1Osaka2ke-2Kyoto3ke-3lainnya9 (ELSE)terakhir
CASE mengembalikan angka sorting seperti "1 untuk Tokyo, 2 untuk Osaka, …" dan kamu ORDER BY angka itu. Ini mengungkapkan urutan kategori sembarang yang tidak bisa dihasilkan urutan string.
-- 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

Bayangkan kebutuhan "tampilkan staff berurutan menurut ukuran kantor (Tokyo → Osaka → Kyoto → lainnya)". (Penjelasan muncul setelah kamu menjalankannya dengan benar.)

① Dari tabel staff, ambil 2 kolom name, city.

② Dengan ORDER BY CASE, tetapkan "Tokyo adalah 1, Osaka adalah 2, Kyoto adalah 3, semua sisanya 9" dan urutkan berdasarkan angka itu. Jadikan ini sort bertingkat di mana baris dalam city yang sama diurutkan berdasarkan name menaik.

SQL Editor

Jalankan query untuk melihat hasil

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 ...).

Cara Menangani NULL dengan CASE
Cara salahCara benarCASE name WHEN NULL THEN 'Unknown' ELSE nameENDCASE WHEN name IS NULL THEN 'Unknown' ELSE nameENDWHEN NULL tak pernah cocok→ 'Unknown' tak pernah munculIS NULL mendeteksiNULL dengan benar
Bentuk simple tidak bisa menulis NULL langsung di WHEN. Saat menangani NULL, beralih ke bentuk searched dan pakai IS NULL / IS NOT NULL.
-- 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

Bayangkan kebutuhan "pada layar daftar customer, tampilkan NULL di kolom email sebagai 'Not registered' alih-alih kosong".

① Dari tabel customer, ambil name dan email.

② Dengan bentuk searched CASE, tambahkan kolom ke-3 beralias email_display yang bernilai 'Not registered' untuk baris yang email-nya NULL, dan nilai email asli selainnya.

SQL Editor

Jalankan query untuk melihat hasil

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;

Bayangkan kebutuhan "konversi massal kolom country tabel customer dari nama negara menjadi kategori wilayah (Asia / Western / Europe / Unknown)". Ini latihan terakhir artikel, jadi kamu melakukan operasi destruktif yang mengubah tabel aktual.

UPDATE massal kolom country tabel customer dengan CASE. Pemetaannya:

- Japan → Asia

- US atau UK → Western

- Italy → Europe

- NULL → Unknown

- Selainnya → pertahankan nilai asli (jadi menjalankan ulang memberi hasil yang sama)

② Setelah UPDATE, jalankan SELECT id, name, country FROM customer ORDER BY id; dan pastikan country tiap customer sudah berubah menjadi nama wilayah.

SQL Editor

Jalankan query untuk melihat hasil
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Manakah berikut ini yang dengan benar menjelaskan ORDER BY CASE WHEN city = 'Tokyo' THEN 1 WHEN city = 'Osaka' THEN 2 ELSE 9 END?

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`?