Pelajaran modul (3/4)
Logika bersyarat: KASUS KAPAN
Segala sesuatu yang telah kita lihat sejauh ini mengekstraksi data apa adanya. Namun sering kali Anda menginginkannya
untuk mengubahnya: mengklasifikasikan gaji ke dalam beberapa tingkatan, menandai karyawan baru sebagai
"junior", terjemahkan kode numerik menjadi label yang dapat dibaca. Standar SQL
alat untuk ini disebut CASE WHEN.
Sintaksnya: mini if/else
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
...
ELSE default_value
ENDBunyinya persis seperti if/else if/else dalam bahasa apa pun: SQL mengevaluasi
kondisi secara berurutan dan berhenti pada kondisi pertama yang benar, mengembalikan
sesuai value. Jika tidak ada yang benar, maka nilai ELSE akan dikembalikan. Jika kamu
hilangkan ELSE dan tidak ada cabang yang cocok, ia mengembalikan NULL.
-- Classify employees by salary tier:
SELECT first_name,
last_name,
salary,
CASE
WHEN salary >= 50000 THEN 'Senior'
WHEN salary >= 35000 THEN 'Mid'
ELSE 'Junior'
END AS tier
FROM employees;CASE tinggal di dalam SELECT: menghasilkan kolom sama seperti kolom lainnya
fungsi, dan sangatlah normal untuk memberinya alias dengan AS (di sini
tier).
Di mana menggunakan KASUS
Tiga tempat berulang:
- Di
SELECTuntuk membuat kolom turunan (contoh di atas). - Dalam
ORDER BYuntuk penyortiran "khusus":SQLORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name; -- Engineering first, then the rest, alphabetically by last name. - Di dalam fungsi agregat untuk "menghitung secara kondisional":
Pola ini —SQL
SELECT COUNT(*) AS total, SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior, SUM(CASE WHEN salary < 35000 THEN 1 ELSE 0 END) AS junior FROM employees;SUM(CASE WHEN … THEN 1 ELSE 0 END)— adalah yang paling umum "penghitungan bersyarat" digunakan di dasbor.
Bentuk "kompak".
Ada juga varian yang lebih pendek saat Anda membandingkan satu ekspresi terhadap nilai eksak:
CASE department_id
WHEN 1 THEN 'Ingegneria'
WHEN 2 THEN 'Vendite'
ELSE 'Altro'
ENDIni setara dengan CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END, hanya saja lebih kompak. Ini hanya berfungsi untuk kesetaraan persis: jika
Anda memerlukan >= atau perbandingan lainnya, Anda harus kembali ke extended
bentuk.
Cobalah
Untuk setiap karyawan, tampilkan nama depan (nama_depan), nama belakang (nama_belakang) dan kolom 'tingkatan' yaitu 'Alto' jika gaji minimal 50000, jika tidak 'Standar'. Tiga kolom, satu baris per karyawan.
Tunjukkan petunjuk
Syaratnya gaji >= 50000. Ingatlah untuk menutup CASE dengan END dan menggunakan alias 'tier'.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Untuk setiap departemen (id_departemen), hitung berapa banyak karyawan yang memiliki gaji tinggi (>= 50000) dan berapa gaji standar (< 50000) dengan menggunakan SUM(CASE...). Tiga kolom: department_id, tinggi, standar. Pesan berdasarkan department_id (NULLS TERAKHIR).
Tunjukkan petunjuk
Pola SUM(CASE WHEN ... THEN 1 ELSE 0 END) adalah hitungan bersyarat.
Solusi tersedia setelah 3 upaya