Đây là một câu hỏi hay và không có câu trả lời hay. Xử lý NULL
trong hai ví dụ của bạn là khác nhau.
Vấn đề cơ bản là NULL
có nghĩa. Thông thường, nó được sử dụng để biểu thị thiếu các giá trị. Tuy nhiên, trong tiêu chuẩn ANSI, nó là viết tắt của chưa biết giá trị. Tôi chắc rằng các triết gia có thể dành nhiều chủ đề cho sự khác biệt giữa "mất tích" và "không xác định".
Trong một biểu thức đơn giản (boolean hoặc số học hoặc vô hướng thuộc loại khác), ANSI xác định kết quả là "chưa biết" trong hầu hết các trường hợp khi bất kỳ toán hạng nào là "không xác định". Có một số ngoại lệ:NULL AND FALSE
là false và NULL IS NULL
là đúng, nhưng những điều này rất hiếm.
Đối với các phép toán tổng hợp, hãy nghĩ đến SUM()
là "tổng tất cả các giá trị đã biết", v.v. SUM()
xử lý NULL
các giá trị khác với +
. Tuy nhiên, hành vi này cũng là tiêu chuẩn để đó là cách tất cả các cơ sở dữ liệu hoạt động.
Nếu bạn muốn một NULL
giá trị cho một tập hợp khi bất kỳ các toán hạng của nó là NULL
, thì bạn cần sử dụng CASE
. Tôi nghĩ cách dễ nhất cho một cột là:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)