🧚 Dengar! Beekeeper Studio adalah GUI database yang cepat, modern, dan open source Unduh
13 Januari 2026 Oleh Matthew Rathbone

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.00 menjadi Medium karena amount < 100 bernilai false dan amount < 500 bernilai 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 = NULL tidak 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

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:

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.

Versi Linux Beekeeper punya fitur 100% lengkap, tanpa potong kompas, tanpa kompromi fitur.

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."
— Alex K., Database Developer
★★★★★
"Saya sudah mencoba banyak GUI database, tapi Beekeeper punya keseimbangan sempurna antara fitur dan kesederhanaan. Langsung jalan."
— Sarah M., Full Stack Engineer

Siap Meningkatkan Alur Kerja SQL Anda?

download Unduh Gratis