TL;DR
NULLIF adalah fungsi SQL yang ngembaliin NULL kalau dua argumennya sama persis, dan ngembaliin argumen pertama kalau beda. Sintaksnya NULLIF(nilai1, nilai2). Pemakaian paling umum: NULLIF(pembagi, 0) buat nyegah error division by zero, karena pembagian dengan NULL hasilnya NULL, bukan error.
NULLIF adalah fungsi SQL yang ngembaliin NULL kalau dua argumennya sama persis. Kalau beda, dia ngembaliin argumen pertama.
Kedengeran nggak berguna, kan? Kenapa kamu mau sengaja bikin data jadi NULL?
Jawabannya: karena pembagian dengan nol bikin query kamu mati, tapi pembagian dengan NULL itu sah-sah aja.
NULLIF nerima dua argumen dan ngebandingin keduanya.
NULLIF(nilai1, nilai2)
Contoh cepat:
SELECT NULLIF(0, 0); -- NULL
SELECT NULLIF(120, 0); -- 120
SELECT NULLIF('', ''); -- NULL
SELECT NULLIF('Jakarta', 'Bandung'); -- Jakarta
Fungsi ini standar SQL. Jalan di PostgreSQL, MySQL, SQL Server, Oracle, SQLite, sampai BigQuery, sintaksnya sama semua.
Contoh di artikel ini pakai tabel performa_sales dari dataset Toko Berkah:
CREATE TABLE performa_sales (
id INT PRIMARY KEY,
nama_sales VARCHAR(50),
kota VARCHAR(30),
jumlah_kunjungan INT,
jumlah_closing INT,
total_omzet INT,
catatan VARCHAR(100)
);
INSERT INTO performa_sales VALUES
(1, 'Siti Rahayu', 'Jakarta', 120, 24, 62000000, 'target tercapai'),
(2, 'Budi Santoso', 'Bandung', 85, 12, 31000000, ''),
(3, 'Dewi Lestari', 'Jakarta', 95, 19, 47000000, 'konsisten'),
(4, 'Agus Pratama', 'Surabaya', 0, 0, 0, ''),
(5, 'Rina Wulandari', 'Jakarta', 60, 0, 0, 'baru gabung');
Pemilik Toko Berkah minta closing rate tiap sales: berapa persen kunjungan yang berujung penjualan.
Query yang kelihatan wajar:
SELECT nama_sales, jumlah_closing / jumlah_kunjungan AS closing_rate
FROM performa_sales;
Di PostgreSQL, hasilnya:
ERROR: division by zero
Bukan cuma baris Agus Pratama yang gagal. Seluruh query mati. Nggak ada satu baris pun yang keluar, walaupun 4 sales lainnya datanya normal.
Ini yang bikin dashboard tiba-tiba blank di hari Senin, cuma gara-gara ada satu sales baru yang belum kunjungan sama sekali.
SQL nolak pembagian dengan nol. Tapi pembagian dengan NULL? Boleh, hasilnya NULL, dan query tetap jalan.
Jadi trik-nya: ubah pembagi nol jadi NULL sebelum pembagian terjadi.
SELECT
nama_sales,
jumlah_closing / NULLIF(jumlah_kunjungan, 0) AS closing_rate
FROM performa_sales;
Sekarang query jalan. Agus Pratama dapat NULL di kolom closing_rate, dan 4 sales lainnya dapat angka normal.
Setiap kali kamu nulis pembagian di SQL, bungkus pembaginya pakai NULLIF. Nggak ada biaya, dan nyelametin query kamu dari mati mendadak.
NULL di laporan tetap kelihatan jelek. Bungkus lagi pakai COALESCE.
SELECT
nama_sales,
COALESCE(
ROUND(jumlah_closing * 100.0 / NULLIF(jumlah_kunjungan, 0), 1),
0
) AS closing_rate_persen
FROM performa_sales;
Bacanya dari dalam ke luar:
NULLIF(jumlah_kunjungan, 0), kunjungan nol jadi NULL.ROUND(..., 1), bulatin ke 1 desimal.COALESCE(..., 0), NULL jadi 0.Hasil akhirnya:
| Sales | Kunjungan | Closing | Closing rate |
|---|---|---|---|
| Siti Rahayu | 120 | 24 | 20,0% |
| Budi Santoso | 85 | 12 | 14,1% |
| Dewi Lestari | 95 | 19 | 20,0% |
| Agus Pratama | 0 | 0 | 0,0% |
| Rina Wulandari | 60 | 0 | 0,0% |
Perhatiin bedanya Agus dan Rina. Dua-duanya tampil 0%, tapi ceritanya beda jauh: Agus belum kunjungan sama sekali, Rina udah 60 kali kunjungan dan belum ada yang closing.
Ini alasan sebagian analis milih nggak pakai COALESCE di kasus ini. Mereka biarin NULL, biar keliatan bedanya "nggak ada data" sama "nol beneran". Pilihan kamu, tapi pilih sadar.
Catatan kecil: perhatiin 100.0, bukan 100. Kalau semua angkanya integer, PostgreSQL bakal ngebulatin hasil bagi jadi integer juga, dan closing rate kamu jadi 0 semua. Kalikan dengan desimal biar hasilnya pecahan.
Data hasil import sering punya campuran NULL dan string kosong buat hal yang sama. Dua-duanya artinya "nggak ada isi", tapi SQL nganggapnya beda.
SELECT nama_sales, NULLIF(catatan, '') AS catatan_bersih
FROM performa_sales;
Budi dan Agus punya catatan berupa string kosong. NULLIF ngubahnya jadi NULL, jadi seragam.
Setelah seragam, kamu bisa nangani semuanya pakai satu COALESCE:
SELECT
nama_sales,
COALESCE(NULLIF(catatan, ''), 'tidak ada catatan') AS catatan
FROM performa_sales;
Tanpa NULLIF, COALESCE nggak bakal ngefek ke string kosong. Dia nganggapnya nilai valid.
NULLIF(0, jumlah_kunjungan) itu salah. Argumen pertama yang bakal dikembaliin kalau beda, jadi query kamu bakal ngasih 0 terus. Yang bener: NULLIF(jumlah_kunjungan, 0).
Query kamu selamat, tapi laporannya penuh sel kosong. Kalau laporannya buat orang non-teknis, bungkus.
jumlah_closing * 100 / NULLIF(jumlah_kunjungan, 0) di PostgreSQL bakal ngasih angka bulat. Pakai 100.0 atau CAST ke DECIMAL.
MySQL default-nya emang ngasih NULL buat pembagian nol, bukan error. Tapi kalau mode SQL-nya diubah jadi ERROR_FOR_DIVISION_BY_ZERO, dia bakal error juga. Dan query kamu tetap mati waktu dipindah ke PostgreSQL. Tulis NULLIF dari awal.
NULLIF(total_omzet, '0'), angka dibanding teks, bisa error atau ngasih hasil aneh tergantung database.
Definisi resminya ada di dokumentasi conditional expressions PostgreSQL.
Kamu bisa nulis hal yang sama pakai CASE:
-- Versi CASE
CASE WHEN jumlah_kunjungan = 0 THEN NULL ELSE jumlah_kunjungan END
-- Versi NULLIF
NULLIF(jumlah_kunjungan, 0)
Hasilnya identik. NULLIF cuma lebih pendek dan langsung kebaca maksudnya. Buat kasus "kalau sama, jadiin NULL", pakai NULLIF. Buat logika yang lebih rumit dari itu, pakai CASE.
NULLIF ngebandingin dua nilai. Kalau keduanya sama persis, dia ngembaliin NULL. Kalau beda, dia ngembaliin nilai pertama. Sintaksnya NULLIF(nilai1, nilai2). Pemakaian paling sering: NULLIF(pembagi, 0) buat nyegah error division by zero, karena SQL nganggap pembagian dengan NULL itu sah dan hasilnya NULL.
SQL nolak pembagian dengan angka nol dan langsung ngeluarin error. Tapi pembagian dengan NULL itu boleh, hasilnya NULL, dan query tetap jalan. NULLIF(jumlah_kunjungan, 0) ngubah nol jadi NULL sebelum pembagian terjadi, jadi database nggak pernah ketemu pembagi nol.
Arahnya kebalikan. NULLIF ngubah nilai tertentu MENJADI NULL. COALESCE ngubah NULL MENJADI nilai lain. Keduanya sering dipasangin: NULLIF bikin pembagi nol jadi NULL supaya query aman, lalu COALESCE ngubah hasil NULL-nya jadi 0 supaya laporan enak dibaca.
Ada. NULLIF itu bagian dari standar SQL, jadi tersedia di PostgreSQL, MySQL, SQL Server, Oracle, SQLite, dan BigQuery dengan sintaks yang sama persis. Kamu nggak perlu ganti apa pun waktu query dipindah antar database.
Bisa, dan ini pemakaian kedua yang paling sering. NULLIF(catatan, '') ngubah string kosong jadi NULL. Berguna waktu data hasil import punya campuran NULL dan string kosong buat hal yang sama. Setelah diseragamin jadi NULL, kamu bisa nangani semuanya pakai satu COALESCE.
Tiga hal yang bikin NULLIF layak masuk kebiasaan kamu:
Coba sekarang: cari satu query kamu yang ada tanda bagi di dalamnya, dan tambahin NULLIF di pembaginya. Butuh 10 detik, dan itu 10 detik yang bakal kamu syukurin waktu ada data baru masuk dengan nilai nol.
Lanjut baca kenapa NULL kelakuannya aneh di NULL di SQL, atau latihan langsung di halaman fungsi NULLIF NgulikData.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Analisa per kuartal, hari kerja, atau musim jadi ribet kalau tiap query ngitung ulang atribut tanggal. Tabel kalender nyimpen semua atribut itu sekali, biar tinggal di-JOIN.
Laporan penjualan harian sering bolong di hari tanpa transaksi. Ini cara bikin deret tanggal lengkap di SQL biar tiap hari muncul, walau nilainya nol.
Struktur organisasi tersimpan sebagai kolom id_atasan yang saling nunjuk. Ini cara narik rantai jabatan, hitung total bawahan, dan span of control cuma pakai SQL.