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.