Vấn đề là NULL không được coi là tương đương với bất cứ thứ gì thậm chí không phải với chính nó, nhưng phần lạ là nó cũng không bằng chính nó.
Hãy xem xét các câu lệnh sau (BTW là bất hợp pháp trong SQL Server T-SQL nhưng hợp lệ trong My-SQL, tuy nhiên đây là những gì ANSI định nghĩa cho null và có thể được xác minh ngay cả trong SQL Server bằng cách sử dụng các câu lệnh tình huống, v.v.)
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
Vì vậy, không có câu trả lời đúng / sai cho câu hỏi, thay vào đó câu trả lời cũng là null.
Điều này có nhiều ý nghĩa, ví dụ như trong
- Các câu lệnh CASE, trong đó mọi giá trị null sẽ luôn sử dụng mệnh đề ELSE trừ khi bạn sử dụng rõ ràng điều kiện WHEN IS NULL ( KHÔNG phải là
WHEN NULL
điều kiện )
- Nối chuỗi, như
SELECT a + NULL -- Results in NULL
- Trong mệnh đề WHERE IN hoặc WHERE NOT IN, như thể bạn muốn có kết quả chính xác, hãy đảm bảo trong truy vấn phụ tương quan để lọc ra bất kỳ giá trị null nào.
Người ta có thể ghi đè hành vi này trong SQL Server bằng cách chỉ định SET ANSI_NULLS OFF
, tuy nhiên điều này KHÔNG được khuyến nghị và không nên được thực hiện vì nó có thể gây ra nhiều vấn đề, đơn giản là vì độ lệch của tiêu chuẩn.
(Như một lưu ý phụ, trong My-SQL có một tùy chọn sử dụng toán tử đặc biệt <=>
để so sánh null.)
Trong so sánh, trong các ngôn ngữ lập trình chung, null được coi là một giá trị thông thường và bằng chính nó, tuy nhiên giá trị NAN cũng không bằng chính nó, nhưng ít nhất nó trả về 'false' khi so sánh nó với chính nó, (và khi kiểm tra không bằng các ngôn ngữ lập trình khác nhau có các cách triển khai khác nhau).
Tuy nhiên, xin lưu ý rằng trong các ngôn ngữ Cơ bản (ví dụ VB, v.v.) không có từ khóa 'null' và thay vào đó, người ta sử dụng từ khóa 'Không có gì', không thể sử dụng để so sánh trực tiếp và thay vào đó, người ta cần sử dụng 'IS' như trong SQL, tuy nhiên trên thực tế nó bằng chính nó (khi sử dụng so sánh gián tiếp).