Fungsi Angka, CAST (::), COALESCE & CASE WHEN
Pembulatan dan hitungan angka, mengubah tipe data dengan CAST dan operator ::, mengganti NULL dengan COALESCE, NULLIF, serta logika jika-maka dengan CASE WHEN.
Analogi: COALESCE itu seperti ban serep: jika nilai utama kosong (NULL), pakai cadangan. CASE WHEN seperti papan penunjuk jalan di persimpangan: "jika harga di atas 100 ribu belok ke Premium, jika di atas 50 ribu ke Menengah, selebihnya ke Ekonomis".
Fungsi angka
| Fungsi | Contoh | Hasil |
|---|---|---|
ROUND(x, n) | ROUND(3.14159, 2) | 3.14 |
CEIL(x) / FLOOR(x) | CEIL(4.2) / FLOOR(4.8) | 5 / 4 |
ABS(x) | ABS(-7) | 7 |
MOD(a, b) atau a % b | MOD(10, 3) | 1 |
POWER(a, b) | POWER(2, 10) | 1024 |
Mengubah tipe data: CAST dan ::
Kadang kamu perlu mengubah tipe, misalnya agar pembagian bilangan bulat menghasilkan desimal. PostgreSQL punya dua cara yang setara:
SELECT CAST(7 AS NUMERIC) / 2; -- cara standar SQL -> 3.5
SELECT 7::numeric / 2; -- cara singkat khas Postgres -> 3.5
SELECT '2025-03-01'::date; -- teks menjadi tanggal
SELECT harga::text FROM buku; -- angka menjadi teks
Operator :: sangat sering muncul di kode PostgreSQL. Bacanya: "ubah ke tipe ...".
COALESCE: pengganti NULL
COALESCE(a, b, c) mengembalikan nilai pertama yang bukan NULL. Cocok untuk memberi nilai cadangan:
SELECT nama, COALESCE(email, 'belum ada email') AS email FROM pelanggan;
Solusi juga untuk jebakan sambung teks: 'Halo ' || COALESCE(nama, 'Tamu').
NULLIF: kebalikannya
NULLIF(a, b) mengembalikan NULL bila a sama dengan b. Berguna mencegah pembagian dengan nol: total / NULLIF(jumlah, 0).
CASE WHEN: jika-maka di dalam SQL
SELECT judul, stok,
CASE
WHEN stok = 0 THEN 'Habis'
WHEN stok < 20 THEN 'Menipis'
ELSE 'Aman'
END AS status_stok
FROM buku;
SQL memeriksa WHEN dari atas ke bawah dan memakai yang pertama benar. Tanpa ELSE, hasilnya NULL bila tidak ada yang cocok. Jangan lupa menutup dengan END.
Analogi: CASE seperti pegawai butik yang memberi label harga: "Kalau harga < 50 ribu → Murah; kalau < 100 ribu → Sedang; selain itu → Premium."
CASE juga bisa dipakai di ORDER BY dan WHERE
SELECT judul FROM buku
ORDER BY CASE WHEN stok = 0 THEN 1 ELSE 0 END, judul; -- yang habis ditaruh di bawah
Kasus nyata: label harga dan nilai default di laporan
Tim marketing meminta kolom kategori harga di laporan, dan email kosong harus tampil sebagai "belum diisi":
SELECT judul, harga,
CASE
WHEN harga >= 100000 THEN 'Premium'
WHEN harga >= 50000 THEN 'Menengah'
ELSE 'Ekonomis'
END AS segmen
FROM buku;
SELECT nama, COALESCE(email, 'belum diisi') AS email FROM pelanggan;
Kesalahan yang sering terjadi
- Lupa
ELSEdi CASE sehingga baris yang tidak cocok menjadi NULL tanpa disadari. - Urutan
WHENyang salah: kondisi pertama yang cocok yang menang, jadi tulis dari yang paling spesifik. - Menjumlahkan kolom yang bisa NULL tanpa
COALESCE:5 + NULLhasilnya NULL.