Một ô trống trên báo cáo có thể là dữ liệu chưa có, trong khi số 0 là một kết quả đã biết. Thay tất cả NULL bằng 0 giúp giao diện đầy đủ hơn nhưng có thể làm mất khác biệt này. COALESCE và NULLIF hữu ích khi được dùng cùng quy tắc nghiệp vụ rõ ràng.
1. Hai biểu thức, hai hướng xử lý
Theo tài liệu PostgreSQL, COALESCE trả đối số đầu tiên không NULL; NULLIF trả NULL khi hai đối số bằng nhau, nếu không thì trả giá trị thứ nhất. Các kiểu dữ liệu phải phù hợp với phép xử lý.
SELECT COALESCE(NULL::text, 'Guest') AS display_name;
SELECT NULLIF('', '') AS missing_text;
Kết quả mong đợi lần lượt là Guest và NULL. Đây là ví dụ truy vấn chỉ đọc, không sửa bảng.
2. Chuỗi rỗng không tự trở thành NULL
Trong PostgreSQL, COALESCE('', 'Guest') giữ chuỗi rỗng. Nếu sản phẩm xác định nickname rỗng nghĩa là chưa khai báo, có thể biểu diễn rõ quy tắc đó:
WITH profiles(id, nickname) AS (
VALUES (1, NULL::text), (2, ''), (3, 'An')
)
SELECT id,
COALESCE(NULLIF(nickname, ''), 'Guest') AS display_name
FROM profiles
ORDER BY id;
Kết quả mong đợi là Guest, Guest và An theo thứ tự id. Chuỗi chỉ chứa khoảng trắng không được xử lý bởi ví dụ này. Có nên trim hay không là quyết định riêng; đừng âm thầm chuẩn hóa trường mà khoảng trắng có ý nghĩa.
3. Mẫu số bằng 0: tránh lỗi mà vẫn giữ ý nghĩa
Giả sử cần tỷ lệ công việc hoàn thành, với completed và total là số đếm không âm, completed không vượt total. Ví dụ PostgreSQL:
WITH jobs(id, completed, total) AS (
VALUES (1, 3, 4), (2, 0, 0), (3, 0, 5)
)
SELECT id,
completed::numeric / NULLIF(total, 0) AS completion_ratio
FROM jobs
ORDER BY id;
Kết quả mong đợi về giá trị là 0.75, NULL và 0; cách hiển thị số chữ số thập phân tùy client. Ép kiểu numeric trước phép chia tránh phép chia số nguyên trong ví dụ. NULLIF chuyển mẫu số 0 thành NULL, nên dòng thứ hai không thực hiện phép chia cho số 0.
Hai dòng cuối không cùng ý nghĩa: không có công việc để tính tỷ lệ khác với có năm việc nhưng chưa hoàn thành việc nào. Giao diện có thể hiển thị “Chưa có công việc” cho trường hợp đầu thay vì tự đổi thành 0%.
4. Không dùng mặc định để che lỗi dữ liệu
Nếu total âm hoặc completed lớn hơn total, NULLIF(total, 0) không sửa được. Những điều kiện này cần kiểm tra ở mô hình dữ liệu hoặc luồng nghiệp vụ. Một truy vấn không báo lỗi chưa chứng minh kết quả là hợp lệ.
Tương tự, thay giá trị cảm biến bị thiếu bằng 0 có thể tạo một quan sát giả. Với mỗi giá trị mặc định, hãy hỏi: đó là số liệu thật, quy ước hiển thị hay cách che một dữ liệu chưa được thu thập?
5. Tách giá trị tính toán khỏi nhãn hiển thị
Nên giữ tỷ lệ dạng số hoặc NULL trong dữ liệu dùng cho tính toán. Nhãn như “Chưa có dữ liệu” thuộc lớp trình bày hoặc một cột riêng. Ghép chuỗi vào biểu thức số có thể gây lỗi kiểu dữ liệu hoặc làm các bước xử lý sau khó sử dụng.
Nếu nghiệp vụ thực sự quy định dùng 0 làm mặc định, ghi rõ quy tắc và kiểm tra tác động đến tổng hợp tiếp theo. Thêm một số 0 vào tập tính trung bình không giống việc bỏ qua một giá trị chưa biết.
6. Checklist kiểm thử
- NULL, chuỗi rỗng và chuỗi khoảng trắng được xét riêng.
- Mẫu số dương, bằng 0 và thiếu dữ liệu có kỳ vọng cụ thể.
- Phép chia sử dụng kiểu số phù hợp.
- Giá trị không hợp lệ không bị che bởi mặc định.
- API và giao diện giữ được sự khác nhau giữa 0 và chưa xác định.
COALESCE và NULLIF giúp viết rõ chính sách xử lý thiếu dữ liệu, nhưng không tự quyết định chính sách đúng. Giá trị mặc định tốt là giá trị đã được thống nhất, không chỉ là cách làm báo cáo hết ô trống.




Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.