Masalah:
Anda ingin menggunakan pernyataan CASE dalam SQL.
Contoh:
Anda memiliki hasil ujian di exam
meja. Anda perlu menetapkan setiap hasil ke salah satu nilai teks berikut:'bad result'
, 'average result'
, atau 'good result'
. Hasil buruk adalah yang di bawah 40, hasil yang baik adalah yang di atas 70, dan sisanya adalah hasil rata-rata.
exam
tabel terlihat seperti ini:
nama | hasil |
---|---|
Toby Shaw | 56 |
Casey Watson | 49 |
Bennie Lynn | 23 |
Sloan Jalur | 70 |
Steff Fox | 85 |
Daerah Reggie | 40 |
Gail Kennedy | 66 |
Brice Mueller | 90 |
Solusi 1:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category FROM exam;
Tabel hasil terlihat seperti ini:
nama | hasil | kategori |
---|---|---|
Toby Shaw | 56 | hasil rata-rata |
Casey Watson | 49 | hasil rata-rata |
Bennie Lynn | 23 | hasil buruk |
Sloan Jalur | 70 | hasil rata-rata |
Steff Fox | 85 | hasil bagus |
Daerah Reggie | 40 | hasil rata-rata |
Gail Kennedy | 66 | hasil rata-rata |
Brice Mueller | 90 | hasil bagus |
Diskusi:
Untuk menampilkan nilai berdasarkan kondisi spesifik Anda, Anda perlu menulis CASE
penyataan. Sintaksnya adalah:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Jika condition_1
terpenuhi, maka nilai yang diambil adalah value_1
. Jika tidak, maka database akan memeriksa condition_2
. Jika condition_2
benar, maka nilai yang diambil adalah value_2
. Jika tidak satu pun dari kondisi ini terpenuhi, SQL akan memeriksa kondisi yang tersisa satu per satu secara berurutan hingga salah satu kondisi terpenuhi. Jika tidak ada kondisi yang terpenuhi, value_n
ditentukan setelah ELSE
diambil.
ELSE
bagian adalah opsional. Jika Anda menghilangkannya dan tidak ada kondisi yang terpenuhi, Anda mendapatkan NULL
.
Ingatlah untuk END
CASE
klausa ketika Anda selesai dengan semua kondisi. Tentu saja, seperti kolom apa pun yang Anda buat, Anda dapat mengganti namanya (AS <column_name>
).
Dalam contoh kita, 'bad result'
ditetapkan ketika result < 40, and 'good result'
ditetapkan ketika result > 70
. Jika tidak satu pun dari kondisi ini terpenuhi, nilainya adalah 'average result'
. Juga, untuk memberi nama kolom nilai teks yang baru dibuat, Anda perlu menggunakan alias (AS
kategori). Beginilah cara Anda mendapatkan:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Sejak 'average result'
ditugaskan ke hasil antara 40
dan 70
(termasuk), Anda juga dapat menulis ketentuan alih-alih ELSE
(lihat Solusi 2 di bawah). Namun, lebih mudah menggunakan ELSE
.
Solusi 2:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' WHEN result >= 40 AND result <= 70 THEN 'average result' END AS category FROM exam;
Tabel hasil terlihat seperti ini:
nama | hasil | kategori |
---|---|---|
Toby Shaw | 56 | hasil rata-rata |
Casey Watson | 49 | hasil rata-rata |
Bennie Lynn | 23 | hasil buruk |
Sloan Jalur | 70 | hasil rata-rata |
Steff Fox | 85 | hasil bagus |
Daerah Reggie | 40 | hasil rata-rata |
Gail Kennedy | 66 | hasil rata-rata |
Brice Mueller | 90 | hasil bagus |
Diskusi:
Sejak 'average result'
ditugaskan ke hasil antara 40
dan 70
(termasuk), Anda dapat menulis ketentuan berikut sebagai ganti ELSE
:
WHEN result >= 40 AND result <= 70 THEN 'average result'
Jika Anda tidak menggunakan ELSE
dan tidak ingin ada NULL
s dalam category
kolom, Anda perlu memastikan bahwa Anda menangani semua kemungkinan result
nilai-nilai. Jika ada result
yang tidak memenuhi salah satu syarat, Anda mendapatkan NULL
.
Solusi 3:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category FROM exam;
Tabel hasil terlihat seperti ini:
nama | hasil | kategori |
---|---|---|
Toby Shaw | 56 | hasil rata-rata |
Casey Watson | 49 | hasil rata-rata |
Bennie Lynn | 23 | hasil buruk |
Sloan Jalur | 70 | hasil rata-rata |
Steff Fox | 85 | hasil bagus |
Daerah Reggie | 40 | hasil rata-rata |
Gail Kennedy | 66 | hasil rata-rata |
Brice Mueller | 90 | hasil bagus |
Diskusi:
Kondisi yang ditentukan dalam CASE
dapat tidak tumpang tindih seperti pada solusi sebelumnya atau tumpang tindih seperti pada solusi ini. Kondisi pertama sama seperti sebelumnya – untuk result < 40
, category
adalah 'bad result'
. Semua hasil di bawah 40
diberi nilai ini pada saat ini dan Anda tidak perlu melakukan apa pun dengannya lagi. Artinya tidak perlu memastikan result >= 40
dalam menentukan kondisi untuk 'average result'
– semua hasil kurang dari 40 sudah memiliki nilai 'bad result'
ditugaskan. Terakhir, untuk hasil yang tersisa, kategorinya harus 'good result'
; ELSE 'good result'
mengurusnya. Beginilah cara Anda mendapatkan:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Catatan:Urutan kondisi dalam CASE
penting. Jika Anda membalik urutan dua kondisi pertama (yaitu, jika Anda menentukan WHEN result <= 70 THEN 'average result'
pertama lalu WHEN result <= 70 THEN 'average result'
detik), semua hasil kurang dari atau sama dengan 70
berakhir di 'average result'
kategori, tanpa hasil yang ditetapkan ke 'bad result'
kategori.