Nó có nghĩa là không có hàng sẽ được trả lại nếu @region
là 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 Region
là 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 NULL
tạo ra giá trị logic thứ ba - UNKNOWN
( trái ngược với TRUE
và FALSE
).
UNKNOWN
giá 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ụ: AND
với một FALSE
toán hạng hoặc OR
với một TRUE
toán hạng) hoặc phủ định ( NOT
).
Các WHERE
khoả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 WHERE
khoản phải TRUE
cho 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 NULL
cộ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, NULL
khô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 NULL
biểu thức, kết quả phụ thuộc vào ANSI_NULLS
cài đặt:
Nếu ANSI_NULLS
được đặt thành ON
, kết quả là NULL
1 , tuân theo quy ước ANSI rằng một NULL
giá trị (hoặc không xác định) không bằng một NULL
giá trị khác hoặc không xác định.
Nếu ANSI_NULLS
được đặt thành OFF
, kết quả của NULL
so với NULL
là TRUE
.
So sánh NULL
với một NULL
giá trị khác luôn dẫn đến kết quả là FALSE
2 .
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 OFF
là cài đặt không ảnh hưởng.