CASE menambahkan logika if/then/else ke query SQL: ia memeriksa daftar kondisi dan mengembalikan hasil untuk kondisi pertama yang bernilai true. Contoh-contohnya berjalan di PostgreSQL, MySQL, SQLite, dan SQL Server.
Cara menggunakan CASE
Tuliskan pasangan WHEN condition THEN result di antara CASE dan END. CASE mengembalikan hasil dari kondisi pertama yang bernilai true, atau nilai ELSE jika tidak ada yang true:
CASE
WHEN condition THEN result
[WHEN condition THEN result ...]
[ELSE result]
END
SELECT
CASE
WHEN 72 >= 90 THEN 'Hot'
WHEN 72 >= 60 THEN 'Mild'
ELSE 'Cold'
END;
-- Output: Mild
Jika setiap kondisi memeriksa kesamaan nilai yang sama, bentuk “simple” yang lebih ringkas cukup menyebut nilai itu sekali:
SELECT
CASE 'amber'
WHEN 'green' THEN 'Go'
WHEN 'amber' THEN 'Slow down'
WHEN 'red' THEN 'Stop'
ELSE 'Unknown'
END;
-- Output: Slow down
Dalam query nyata, kondisinya menguji kolom, dan CASE menambahkan kolom baru ke hasil:
-- Input: orders
-- order_id | amount
-- ---------+--------
-- 1001 | 45.00
-- 1002 | 100.00
-- 1003 | 349.99
-- 1004 | 1250.00
SELECT
order_id,
amount,
CASE
WHEN amount < 100 THEN 'Small'
WHEN amount < 500 THEN 'Medium'
ELSE 'Large'
END AS order_size
FROM orders;
-- Output:
-- order_id | amount | order_size
-- ---------+---------+-----------
-- 1001 | 45.00 | Small
-- 1002 | 100.00 | Medium
-- 1003 | 349.99 | Medium
-- 1004 | 1250.00 | Large
Aturan yang perlu diketahui
-
Kondisi true pertama yang menang. Kondisi diperiksa dari atas ke bawah, jadi letakkan yang paling sempit di awal. Di atas,
100.00menjadi Medium karenaamount < 100bernilai false danamount < 500bernilai true. Jika urutannya salah, nilai kecil tidak pernah sampai ke cabangnya:
SELECT
CASE
WHEN 45 < 500 THEN 'Medium'
WHEN 45 < 100 THEN 'Small' -- can never win
ELSE 'Large'
END;
-- Output: Medium
- Tanpa ELSE, jika tidak ada yang cocok hasilnya NULL.
SELECT CASE WHEN 72 >= 90 THEN 'Hot' END;
-- Output: NULL
-
Uji NULL dengan IS NULL.
NULL = NULLtidak bernilai true, jadi bentuk simple tidak bisa mencocokkan NULL. Gunakan bentuk searched:
SELECT CASE NULL WHEN NULL THEN 'matched' ELSE 'no match' END;
-- Output: no match
SELECT CASE WHEN NULL IS NULL THEN 'matched' ELSE 'no match' END;
-- Output: matched
- Setiap hasil harus bertipe kompatibel. Mencampur angka dan teks dalam satu CASE akan gagal di PostgreSQL dan SQL Server, jadi lakukan cast pada angkanya:
-- Input: products
-- name | stock
-- -------------+------
-- Desk Lamp | 12
-- Office Chair | 0
SELECT name, CASE WHEN stock > 0 THEN stock ELSE 'Sold out' END AS stock
FROM products;
-- PostgreSQL: ERROR: invalid input syntax for type integer: "Sold out"
-- SQL Server: Conversion failed when converting the varchar value 'Sold out' to data type int.
-- (in MySQL, cast with CAST(stock AS CHAR))
SELECT
name,
CASE WHEN stock > 0 THEN CAST(stock AS VARCHAR(10)) ELSE 'Sold out' END AS stock
FROM products;
-- Output:
-- name | stock
-- -------------+---------
-- Desk Lamp | 12
-- Office Chair | Sold out
Sintaks alternatif
Untuk satu kondisi saja, Anda juga akan menemukan fungsi yang lebih ringkas:
-- MySQL
SELECT IF(72 >= 60, 'Mild', 'Cold');
-- Output: Mild
-- SQL Server and SQLite
SELECT IIF(72 >= 60, 'Mild', 'Cold');
-- Output: Mild
Dua fungsi lain adalah singkatan untuk ekspresi CASE yang umum. COALESCE(nickname, name) berarti CASE WHEN nickname IS NOT NULL THEN nickname ELSE name END, dan NULLIF(a, b) berarti CASE WHEN a = b THEN NULL ELSE a END. Lihat panduan SQL COALESCE untuk yang pertama.
MySQL juga punya statement CASE untuk stored procedure, yang diakhiri dengan END CASE. Artikel ini membahas ekspresi CASE yang Anda gunakan di query.
Kapan sebaiknya menggunakan CASE?
CASE adalah ekspresi, jadi bisa dipakai di mana pun sebuah nilai bisa dipakai: di daftar SELECT, di ORDER BY dan GROUP BY, serta di dalam fungsi agregat. CASE juga bisa dipakai di WHERE, tetapi AND dan OR biasa umumnya lebih jelas di sana. Sebagian besar penggunaannya masuk ke salah satu dari lima kategori ini.
Mengelompokkan angka ke dalam rentang
Ubah angka menjadi kelompok: tingkatan harga, ukuran pesanan, kelompok usia, nilai. Tulis kondisinya dari satu ujung skala ke ujung lainnya, agar kecocokan pertama adalah yang benar.
Menerjemahkan kode menjadi label
Database menyimpan kode singkat seperti 'A', 'ENG', atau 'gold'; sedangkan orang ingin membaca kata. CASE simple memetakan setiap kode ke sebuah label, atau ke nilai seperti tingkat diskon, dan ELSE menangkap kode yang tidak Anda duga.
Menghitung atau menjumlahkan sebagian baris saja
Letakkan CASE di dalam COUNT atau SUM untuk menghitung atau menjumlahkan hanya baris yang memenuhi suatu kondisi. COUNT(CASE WHEN ... THEN 1 END) berfungsi karena baris yang tidak cocok menghasilkan NULL, yang dilewati COUNT. Satu agregat per kondisi memberi Anda beberapa total berdampingan, dan begitulah cara membuat pivot table di SQL.
Menangani nilai yang hilang
Periksa kolom untuk NULL sesuai urutan prioritas, dan kembalikan label jika semuanya kosong. Untuk fallback biasa, COALESCE lebih ringkas. CASE adalah pilihan tepat ketika setiap jenis kekosongan butuh hasil berbeda.
Mengurutkan dengan urutan kustom
Urutan alfabet dan numerik tidak cocok untuk semua hal: ukuran pakaian, prioritas tiket, daftar dengan produk unggulan di urutan teratas. CASE di ORDER BY memberi setiap nilai posisi yang Anda inginkan.
Contoh nyata CASE
Mengklasifikasikan produk berdasarkan departemen dan harga
Sebuah hasil bisa berupa CASE juga, sehingga setiap departemen mendapat rentang harganya sendiri:
-- Input: products
-- product_name | category | price
-- -----------------+-------------+--------
-- Laptop Pro 14 | Electronics | 1499.00
-- Wireless Earbuds | Electronics | 129.00
-- Leather Jacket | Clothing | 349.00
-- Cotton T-Shirt | Clothing | 19.99
-- Coffee Mug | Kitchen | 12.50
SELECT
product_name,
CASE category
WHEN 'Electronics' THEN
CASE
WHEN price > 1000 THEN 'Premium Electronics'
ELSE 'Standard Electronics'
END
WHEN 'Clothing' THEN
CASE
WHEN price > 200 THEN 'Designer Clothing'
ELSE 'Regular Clothing'
END
ELSE 'Other Products'
END AS product_class
FROM products;
-- Output:
-- product_name | product_class
-- -----------------+---------------------
-- Laptop Pro 14 | Premium Electronics
-- Wireless Earbuds | Standard Electronics
-- Leather Jacket | Designer Clothing
-- Cotton T-Shirt | Regular Clothing
-- Coffee Mug | Other Products
Lebih dari dua level, CASE bersarang jadi sulit dibaca. Tabel lookup yang Anda join biasanya lebih jelas.
Menerapkan diskon berdasarkan tingkatan pelanggan
Setiap kode tingkatan dipetakan ke tingkat diskon, dan pelanggan tanpa tingkatan tidak mendapat diskon:
-- Input: customers
-- id | customer_name | tier
-- ---+---------------+-------
-- 1 | Maya Brooks | gold
-- 2 | Leo Martin | silver
-- 3 | Ava Kim | bronze
-- 4 | Noah Price | NULL
-- Input: orders
-- id | customer_id | order_total
-- ----+-------------+------------
-- 101 | 1 | 200.00
-- 102 | 2 | 150.00
-- 103 | 3 | 80.00
-- 104 | 4 | 60.00
SELECT
customer_name,
order_total,
ROUND(order_total * CASE tier
WHEN 'gold' THEN 0.15
WHEN 'silver' THEN 0.10
WHEN 'bronze' THEN 0.05
ELSE 0
END, 2) AS discount
FROM customers c
JOIN orders o ON c.id = o.customer_id
ORDER BY o.id;
-- Output:
-- customer_name | order_total | discount
-- --------------+-------------+---------
-- Maya Brooks | 200.00 | 30.00
-- Leo Martin | 150.00 | 15.00
-- Ava Kim | 80.00 | 4.00
-- Noah Price | 60.00 | 0.00
Pivot penjualan bulanan menjadi kolom
Satu SUM(CASE ...) per bulan mengubah baris-baris penjualan menjadi satu kolom untuk setiap bulan:
-- Input: sales
-- product_category | sale_date | amount
-- -----------------+------------+-------
-- Books | 2026-01-12 | 40.00
-- Games | 2026-01-20 | 60.00
-- Books | 2026-02-03 | 25.00
-- Books | 2026-03-15 | 30.00
-- Games | 2026-03-28 | 75.00
SELECT
product_category,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 1 THEN amount ELSE 0 END) AS jan_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 2 THEN amount ELSE 0 END) AS feb_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 3 THEN amount ELSE 0 END) AS mar_sales
FROM sales
GROUP BY product_category
ORDER BY product_category;
-- Output:
-- product_category | jan_sales | feb_sales | mar_sales
-- -----------------+-----------+-----------+----------
-- Books | 40.00 | 25.00 | 30.00
-- Games | 60.00 | 0 | 75.00
Di SQL Server, gunakan MONTH(sale_date) = 1 sebagai ganti EXTRACT; di SQLite, gunakan strftime('%m', sale_date) = '01'.
Membedakan nilai hilang dari nilai kosong
Data hasil impor sering berisi NULL sekaligus string kosong. CASE bisa memberi label pada masing-masing agar Anda tahu apa yang perlu dibersihkan:
-- Input: users
-- id | middle_name
-- ---+------------
-- 1 | Rose
-- 2 |
-- 3 | NULL
SELECT
id,
CASE
WHEN middle_name IS NULL THEN 'Missing'
WHEN middle_name = '' THEN 'Empty'
ELSE middle_name
END AS middle_name
FROM users;
-- Output:
-- id | middle_name
-- ---+------------
-- 1 | Rose
-- 2 | Empty
-- 3 | Missing
Menampilkan produk unggulan lebih dulu
Beri setiap kategori posisi urutan, lalu urutkan berdasarkan nama di dalamnya:
-- Input: products
-- product_name | category
-- -------------+------------
-- Wool Scarf | Sale
-- Desk Lamp | Featured
-- Bike Helmet | Clearance
-- Smart Watch | New Arrival
-- Air Fryer | Featured
SELECT product_name, category
FROM products
ORDER BY
CASE category
WHEN 'Featured' THEN 1
WHEN 'New Arrival' THEN 2
WHEN 'Sale' THEN 3
ELSE 4
END,
product_name;
-- Output:
-- product_name | category
-- -------------+------------
-- Air Fryer | Featured
-- Desk Lamp | Featured
-- Smart Watch | New Arrival
-- Wool Scarf | Sale
-- Bike Helmet | Clearance
Bacaan lanjutan tentang CASE
Di blog ini:
- Panduan SQL COALESCE: cara singkat memberi nilai cadangan saat sebuah nilai NULL
- Panduan pivot table SQL: CASE di dalam SUM dan AVG untuk mengubah baris menjadi kolom
- Panduan SQL ORDER BY: pengurutan, termasuk urutan kustom
- Panduan SQL GROUP BY: pengelompokan yang menjadi dasar hitungan dan total kondisional
- Panduan SQL not equal: mengapa perbandingan dengan NULL tidak pernah cocok
Dokumentasi resmi:
Beekeeper Studio Adalah GUI Database Gratis & Open Source
Tool query & editor SQL terbaik yang pernah saya pakai. Semua yang saya butuhkan untuk mengelola database ada di sini. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio cepat, intuitif, dan mudah digunakan. Beekeeper mendukung banyak sekali database, dan berjalan mulus di Windows, Mac, dan Linux.
Apa Kata Pengguna Tentang Beekeeper Studio
"Beekeeper Studio benar-benar menggantikan alur kerja SQL lama saya. Cepat, intuitif, dan membuat kerja dengan database jadi menyenangkan lagi."
"Saya sudah mencoba banyak GUI database, tapi Beekeeper punya keseimbangan sempurna antara fitur dan kesederhanaan. Langsung jalan."