Lompati ke konten utama
Modul 4 · Pelajaran 3 dari 415/57 dalam kursus~10 min
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

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

Bunyinya 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.

SQL
-- 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:

  1. Di SELECT untuk membuat kolom turunan (contoh di atas).
  2. Dalam ORDER BY untuk penyortiran "khusus":
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Engineering first, then the rest, alphabetically by last name.
  3. Di dalam fungsi agregat untuk "menghitung secara kondisional":
    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;
    Pola ini — 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:

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

Ini 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

Latihan#sql.m4.l3.e1
Upaya: 0Memuat…

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.

Memuat editor…
Tunjukkan petunjuk

Syaratnya gaji >= 50000. Ingatlah untuk menutup CASE dengan END dan menggunakan alias 'tier'.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#sql.m4.l3.e2
Upaya: 0Memuat…

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).

Memuat editor…
Tunjukkan petunjuk

Pola SUM(CASE WHEN ... THEN 1 ELSE 0 END) adalah hitungan bersyarat.

Solusi tersedia setelah 3 upaya