Belajar dengan membaca secara berurutan

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.

Sebelum latihan, mari pastikan definisi kolom dan sampel data dari tabel staff.

① Pakai PRAGMA table_info(staff); untuk memeriksa nama kolom, tipe, dan primary key.

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

SQL Editor

Jalankan query untuk melihat hasil

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 WHEN mana pun menjadi NULL. Untuk menghindari NULL, sebutkan default secara eksplisit dengan ELSE.

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.

Percabangan dalam Bentuk Simple
kolom targetnilai WHENnilai dikembalikanCASE city= 'Tokyo'= 'Osaka'ELSE'TOK''OSA'city asli
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;

Bayangkan kebutuhan "tampilkan kolom city sebagai kode singkat". (Penjelasan muncul setelah kamu menjalankannya dengan benar.)

① Dari tabel staff, ambil name dan city.

② Dengan bentuk simple CASE, tambahkan kolom ke-3 beralias city_code yang bernilai 'TOK' jika city Tokyo, 'OSA' jika Osaka, 'KYO' jika Kyoto, 'YOK' jika Yokohama, 'SAP' jika Sapporo, dan nilai city asli jika tidak ada yang cocok.

SQL Editor

Jalankan query untuk melihat hasil

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.

Percabangan dalam Bentuk Searched — Dievaluasi Atas ke Bawah
evaluasi WHEN atas-bawahceknilai dikembalikansalary >= 6000000salary >= 4500000ELSEjika TRUEjika TRUEsisanya semua'Senior''Mid''Junior'FALSEFALSE
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;

Bayangkan kebutuhan "klasifikasikan staff menjadi 3 tier (Junior / Mid / Senior) berdasarkan salary".

① Dari tabel staff, ambil name dan salary.

② Dengan bentuk searched CASE, tambahkan kolom ke-3 beralias tier yang bernilai 'Senior' jika salary 6,000,000 atau lebih, 'Mid' jika 4,500,000 atau lebih tetapi di bawah 6,000,000, dan 'Junior' jika di bawah itu.

SQL Editor

Jalankan query untuk melihat hasil

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;

Bayangkan kebutuhan "bagi semua staff menjadi generasi berdasarkan tahun lahir dalam satuan 10 tahun".

① Dari tabel staff, ambil name dan birthday.

② Dengan bentuk searched CASE, tambahkan kolom ke-3 beralias generation yang bernilai 'Gen Z' jika tahun lahir yang ditarik dari birthday ada di tahun 1990-an, 'Gen X-Y' jika di tahun 1980-an, dan 'Other' selainnya.

SQL Editor

Jalankan query untuk melihat hasil

Bayangkan kebutuhan "tampilkan TOP 5 berdasarkan salary di layar ranking, masing-masing dengan anotasi label pay-band".

① Dari tabel staff, ambil name dan salary.

② Dengan bentuk searched CASE, tambahkan kolom ke-3 beralias tier dengan label pay-band yang sama seperti Latihan 2 ('Senior' jika salary 6,000,000 atau lebih, 'Mid' jika 4,500,000 atau lebih, 'Junior' selainnya).

③ Urutkan berdasarkan `salary` menurun dan batasi ke 5 baris pertama.

SQL Editor

Jalankan query untuk melihat hasil
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Manakah berikut ini struktur ekspresi CASE yang benar?

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?