Báo cáo gửi sếp có 40 ô hiện chữ “null”. Sửa bằng hai hàm, không cần đụng đến dữ liệu gốc.
Bài toán
Báo cáo có ô trống ở khắp nơi. Không phải lỗi dữ liệu — chỉ là chưa có thông tin. Nhưng hiện NULL thì trông như hỏng.
COALESCE — lấy giá trị đầu tiên khác NULL
SELECT
ten,
COALESCE(dien_thoai, email, 'chưa có') AS lien_he,
COALESCE(so_du, 0) AS so_du
FROM khach_hang;
Nó duyệt từ trái sang phải và dừng ở giá trị đầu tiên không phải NULL. Nhận bao nhiêu tham số cũng được.
NULL mang nghĩa “không biết”, và AVG cố tình bỏ qua nó.
NULLIF — biến một giá trị thành NULL
NULLIF(a, b) -- trả về NULL nếu a = b, ngược lại trả về a
Công dụng lớn nhất: chặn lỗi chia cho 0.
SELECT ROUND(100.0 * so_dat / NULLIF(tong, 0), 1) AS ty_le
FROM thong_ke;
Mẫu số bằng 0 thành NULL, phép chia trả về NULL thay vì làm hỏng cả truy vấn.
Công dụng thứ hai: coi chuỗi rỗng như thiếu dữ liệu.
COALESCE(NULLIF(TRIM(ghi_chu), ''), 'không có ghi chú')
Lỗi thường gặp
1. Dùng ISNULL hoặc IFNULL rồi mang sang hệ khác
ISNULL là SQL Server, IFNULL là MySQL, NVL là Oracle. Chỉ COALESCE là chuẩn ANSI và chạy ở mọi nơi.
2. COALESCE làm mất chỉ mục
-- Quét toàn bảng
WHERE COALESCE(trang_thai, 'moi') = 'moi'
-- Dùng được chỉ mục
WHERE trang_thai = 'moi' OR trang_thai IS NULL
3. Kiểu dữ liệu không khớp
-- Lỗi trên vài hệ: trộn số và chuỗi
COALESCE(so_luong, 'chưa nhập')
Mọi tham số phải cùng kiểu. Muốn hiển thị chữ thì ép số sang chuỗi trước.
Luyện tập
- LeetCode 1179 — Reformat Department Table
- LeetCode 1795 — Rearrange Products Table
- LeetCode 1965 — Employees With Missing Information
- LeetCode 1075 — Project Employees I
- HackerRank — Population Census
Tóm lại
COALESCEtrả về giá trị đầu tiên khácNULL, chạy trên mọi hệ.- Chỉ thay
NULLbằng 0 khi 0 thật sự đúng nghĩa. NULLIF(mẫu, 0)là cách chuẩn chặn lỗi chia cho 0.COALESCEtrongWHERElàm mất chỉ mục.- Mọi tham số của
COALESCEphải cùng kiểu dữ liệu.
Bạn vừa học xong COALESCE và NULLIF
Sẵn sàng luyện tập chưa?
Làm bài tập COALESCE và NULLIF trên dữ liệu thật, chấm điểm ngay khi bạn bấm chạy.
Bắt đầu luyện tập →