2013-07-03 22 views
5

Một lý thuyết Câu hỏi ...đâu Khoản bỏ Rows nếu NULL xảy ra

Khi một tập hợp các truy vấn như đưa ra dưới đây là bắn rồi ...

Create table Temp1(C1 varchar(2)) 
Create table Temp2(C1 varchar(2)) 
insert into Temp1 Values('A'),(NULL),('B') 
insert into Temp2 Values('B'),(NULL),('C'),(NULL) 

select *from Temp1 A,Temp2 B 
where A.C1 <> B.C1 

... mang đến cho ...

Actual Result

Tôi đã sử dụng A.C1 <> B.C1 trong mệnh đề Where.


Nhưng tôi mong đợi ...

enter image description here

Để kết quả như đầu ra tôi cần phải sử dụng ISNULL(A.C1,'') <> ISNULL(B.C1,'') trong mệnh đề Where mong đợi.

Câu hỏi của tôi là tại sao tôi cần phải sử dụng ISNULL mỗi lần để nhận được kết quả như mong đợi, vì NULL không bằng bất kỳ dữ liệu chuỗi nào.

+1

Bởi vì null có ý nghĩa đặc biệt không có giá trị. bất kỳ so sánh nào trong đó một bên là null sẽ mang lại giá trị rỗng và đánh giá sai - hãy đọc tại đây http://msdn.microsoft.com/en-us/library/ms191504(v=sql.105).aspx –

+4

Mọi thứ được so sánh với 'NULL' luôn trả về 'NULL' (không xác định) không đúng hoặc sai và do đó không thể đáp ứng tiêu chí của bạn. –

Trả lời

4

Trích từ here là hoàn hảo:

Cách đúng để hiểu NULL là nó không phải là một giá trị. Không phải “đây là giá trị NULL” nhưng “NULL này không phải là giá trị.” Mọi thứ hoặc là một giá trị hoặc không phải là giá trị. Khi một cái gì đó là một giá trị, đó là “1”, hoặc “xin chào” hoặc “xanh lục” hoặc “$ 5.00” - nhưng khi một cái gì đó không phải là giá trị , nó hoàn toàn không có gì cả. SQL đại diện cho "điều này không có giá trị " bởi giá trị NULL không đặc biệt. Khi ai đó nói "giá trị NULL ", một người nên không đồng ý về mặt tinh thần, bởi vì không có điều gì như vậy. NULL là sự vắng mặt hoàn toàn của bất kỳ giá trị nào.

Null không bằng bất kỳ thứ gì, do đó so sánh luôn thất bại.

Ví dụ thử truy vấn này:

select * 
from Temp2 B 
where B.C1 = null 

nó sẽ không trả lại bất kỳ hàng!

Các null xử lý bạn phải sử dụng is null hoặc is not null:

select * 
from Temp1 A, Temp2 B 
where A.C1 <> B.C1 or (A.C1 is null and B.C1 is not null) or (B.C1 is null and A.C1 is not null) 

trở lại chính xác các giá trị tương tự mà truy vấn của bạn với ISNULL lợi nhuận.

Các vấn đề liên quan