Nó có nghĩa là không có hàng sẽ được trả lại nếu @regionlà NULL, khi được sử dụng trong ví dụ đầu tiên của bạn, ngay cả khi có hàng trong bảng ở đâu Regionlà NULL.
Khi nào ANSI_NULLSđược bật (mà bạn nên luôn bật, vì tùy chọn không bật sẽ bị loại bỏ trong tương lai), bất kỳ thao tác so sánh nào trong đó (ít nhất) một trong các toán hạng được NULLtạo ra giá trị logic thứ ba - UNKNOWN( trái ngược với TRUEvà FALSE).
UNKNOWNgiá trị truyền qua bất kỳ toán tử boolean kết hợp nào nếu chúng chưa được quyết định (ví dụ: ANDvới một FALSEtoán hạng hoặc ORvới một TRUEtoán hạng) hoặc phủ định ( NOT).
Các WHEREkhoản được sử dụng để lọc các tập kết quả được tạo ra bởi các FROMđiều khoản, như vậy tổng giá trị của WHEREkhoản phải TRUEcho hàng không được lọc ra. Vì vậy, nếu một UNKNOWNđược tạo ra bởi bất kỳ so sánh nào, nó sẽ khiến hàng đó bị lọc ra.
Câu trả lời của @ user1227804 bao gồm câu trích dẫn này:
Nếu cả hai bên của phép so sánh là cột hoặc biểu thức ghép, cài đặt không ảnh hưởng đến phép so sánh.
từ *SET ANSI_NULLS
Tuy nhiên, tôi không chắc nó đang cố gắng thực hiện điểm nào, vì nếu hai NULLcột được so sánh (ví dụ: trong a JOIN), so sánh vẫn không thành công:
create table
ID int not null,
Val1 varchar(10) null
)
insert into
create table
ID int not null,
Val1 varchar(10) null
)
insert into
select * from
Truy vấn trên trả về 0 hàng, trong khi:
select * from
Trả về một hàng. Vì vậy, ngay cả khi cả hai toán hạng là cột, NULLkhông bằng nhau NULL. Và tài liệu cho= không có bất cứ điều gì để nói về các toán hạng:
Khi bạn so sánh hai NULLbiểu thức, kết quả phụ thuộc vào ANSI_NULLScài đặt:
Nếu ANSI_NULLSđược đặt thành ON, kết quả là NULL1 , tuân theo quy ước ANSI rằng một NULLgiá trị (hoặc không xác định) không bằng một NULLgiá trị khác hoặc không xác định.
Nếu ANSI_NULLSđược đặt thành OFF, kết quả của NULLso với NULLlà TRUE.
So sánh NULLvới một NULLgiá trị khác luôn dẫn đến kết quả là FALSE2 .
Tuy nhiên, cả 1 và 2 đều không chính xác - kết quả của cả hai phép so sánh là UNKNOWN.
* Ý nghĩa khó hiểu của văn bản này cuối cùng đã được khám phá nhiều năm sau đó. Điều thực sự có nghĩa là, đối với những so sánh đó, cài đặt không có hiệu lực và nó luôn hoạt động như thể cài đặt được BẬT . Sẽ rõ ràng hơn nếu nó đã nói rằng đó SET ANSI_NULLS OFFlà cài đặt không ảnh hưởng.