Soal 1Manakah berikut ini struktur ekspresi CASE yang benar?
Fungsi ⑤ — CASE untuk Percabangan Multi-Kondisi
Artikel kelima dari fungsi SQL. Dua bentuk CASE (bentuk simple dan bentuk searched), percabangan tiga atau lebih, mengkombinasikannya dengan fungsi dan kondisi compound, serta memadukannya dengan ORDER BY — pada data staff dari CSV.
Data yang Dipakai di Artikel Ini — Tabel staff
IIF yang dibahas di artikel sebelumnya hanya punya satu kondisi, jadi ia hanya bisa melakukan percabangan benar/salah dua arah. Ekspresi CASE di artikel ini mengevaluasi tiga kondisi atau lebih secara berurutan dan bisa mengembalikan nilai berbeda untuk masing-masing. Ini adalah sintaks dasar untuk menulis "if-elseif-else" di dalam SQL, dan ini konstruksi percabangan yang paling umum di kerja nyata — kategorisasi laporan, pengelompokan wilayah, ranking grade, dan sebagainya.
Subjeknya adalah tabel staff yang sama (10 baris) seperti sebelumnya. Lewat latihan yang membangun klasifikasi wilayah pada kolom city, klasifikasi rentang gaji pada salary, dan klasifikasi generasi pada birthday, kamu akan mencoba dua bentuk CASE dan penerapannya pada kondisi compound secara berurutan.
CASE Punya Dua Cara Penulisan
Ekspresi CASE punya dua bentuk — bentuk simple dan bentuk searched — dan keduanya bisa menghasilkan hasil yang sama. Dua aturan berlaku untuk keduanya.
- `END` di akhir wajib — melupakannya adalah syntax error.
- `ELSE` opsional — jika diabaikan, baris yang tidak cocok
WHENmana pun menjadi NULL. Untuk menghindari NULL, sebutkan default secara eksplisit denganELSE.
Bentuk ① Bentuk Simple — Perbandingan Kesetaraan pada Sebuah Kolom
Bentuk simple ditulis CASE kolom WHEN nilai1 THEN hasil1 WHEN nilai2 THEN hasil2 ... ELSE default END. Tepat setelah CASE kamu menaruh satu kolom yang dibandingkan, dan di kanan WHEN kamu menulis nilai yang diuji kesetaraannya terhadap kolom. Pengujiannya hanya kesetaraan (`=`), dan kamu hanya bisa menulis satu nilai di kanan WHEN — beberapa nilai seperti WHEN ('Tokyo', 'Osaka') tidak diperbolehkan. Ini cocok untuk substitusi sederhana kolom = nilai dan lebih pendek penulisannya.
CASE city melihat satu kolom dan melakukan perbandingan kesetaraan dengan tiap nilai WHEN. Nilai THEN dari WHEN yang cocok dikembalikan; jika tidak ada yang cocok, nilai ELSE dipakai.-- Bentuk simple — ganti city dengan nama wilayah
SELECT name, city,
CASE city
WHEN 'Tokyo' THEN 'Kanto'
WHEN 'Yokohama' THEN 'Kanto'
WHEN 'Osaka' THEN 'Kansai'
WHEN 'Kyoto' THEN 'Kansai'
ELSE 'Other'
END AS region
FROM staff;
Bentuk ② Bentuk Searched — Tulis Kondisi Apa Pun secara Bebas
Bentuk searched ditulis CASE WHEN ekspr1 THEN hasil1 WHEN ekspr2 THEN hasil2 ... ELSE default END. Tepat setelah CASE kamu menulis apa pun tidak, dan di kanan tiap WHEN kamu menaruh kondisinya sendiri. Operator perbandingan seperti salary >= 6000000, LIKE seperti name LIKE '%Tanaka', IN, dan kondisi compound AND / OR — apa pun yang bisa kamu tulis di WHERE berlaku di sini. WHEN dievaluasi dari atas ke bawah, dan nilainya ditentukan oleh percabangan pertama yang menjadi TRUE. Karena sangat ekspresif, ini bentuk yang terutama dipakai dalam praktik.
WHEN dievaluasi dari atas ke bawah. Begitu sebuah kondisi TRUE nilai THEN ditetapkan dan tidak ada pemeriksaan lebih lanjut. Pada FALSE ia turun ke WHEN berikutnya; jika semua FALSE, nilai ELSE dipakai.-- Bentuk searched — bagi salary menjadi 2 rentang
SELECT name, salary,
CASE
WHEN salary >= 5000000 THEN 'High'
ELSE 'Standard'
END AS pay_band
FROM staff;
Mengkombinasikan dengan Fungsi dan Kondisi Compound untuk Percabangan Lebih Kompleks
Sebuah klausa CASE WHEN bisa memuat ekspresi yang mengkombinasikan operator perbandingan, LIKE, IN, AND / OR, dan pemanggilan fungsi. Kamu bisa menarik tahun lahir dengan strftime('%Y', birthday) yang dipelajari di Fungsi ① fungsi tanggal untuk klasifikasi generasi; karena name ada dalam urutan "nama depan surname", name LIKE '%Tanaka' (cocok suffix) mengklasifikasikan orang yang surname-nya Tanaka; dan kamu bisa menulis kondisi yang mengkombinasikan beberapa kolom dengan AND.
Contoh di bawah menarik tahun lahir dalam satuan 10 tahun dan memberi label orang yang lahir di tahun 1990-an sebagai 'Gen Z' dan tahun 1980-an sebagai 'Gen X-Y'. Karena strftime mengembalikan string, perbandingannya dilakukan terhadap literal string ('1990' / '1999').
-- 1) Beri label tahun lahir dalam kelompok 5 tahun
SELECT name, birthday,
CASE
WHEN strftime('%Y', birthday) BETWEEN '1985' AND '1989' THEN 'Late 1980s'
WHEN strftime('%Y', birthday) BETWEEN '1990' AND '1994' THEN 'Early 1990s'
ELSE 'Other'
END AS cohort
FROM staff;
-- 2) Kondisi compound: salary tinggi AND berbasis di Tokyo
SELECT name, city, salary,
CASE
WHEN salary >= 6000000 AND city = 'Tokyo' THEN 'Tokyo senior'
WHEN salary >= 6000000 THEN 'Senior'
ELSE 'Other'
END AS tag
FROM staff;
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Manakah deskripsi yang benar untuk bentuk simple CASE city WHEN 'Tokyo' THEN 'TOK' WHEN 'Osaka' THEN 'OSA' ELSE city END?
Soal 3Apa yang dikembalikan CASE WHEN salary >= 6000000 THEN 'Senior' WHEN salary >= 4500000 THEN 'Mid' ELSE 'Junior' END untuk baris dengan salary = 7,000,000?