2015-06-02 18 views
10

Hãy nói rằng tôi có một bảng gọi là nameAge:sql không bình thường kết quả truy vấn máy chủ

ID Name Age 
1 X  12 
2 Y  12 
3 null null 
4 Z  12 

và khi tôi chạy một truy vấn như:

select * from nameAge where Age <> 12 

nó sẽ trả về cho tôi một kết quả rỗng đặt trong khi tôi có hàng với id 3 trong đó age khác với null?

Sử dụng Sql Server 2008 R2.

Bất kỳ ý tưởng nào?

Chỉnh sửa: Có thể trùng lặp với câu trả lời được đề xuất có thể ở một thời điểm nhưng không bao gồm và nó cho biết cách sử dụng giá trị null khi so sánh với giá trị null. giá trị

+1

NULL không bằng 12 – sqluser

+1

@sqluser: Không. Nó cũng không bằng 12. –

+0

có thể trùng lặp của [Không bằng <>! = Toán tử trên NULL] (http://stackoverflow.com/questions/5658457/not-equal-operator-on-null) –

Trả lời

16

Đây là hành vi dự định. Bạn không thể so sánh các giá trị NULL bằng cách sử dụng = hoặc <>. Bạn phải sử dụng IS NULL hoặc IS NOT NULL.

Nếu bạn muốn NULL giá trị chỉ sử dụng IS NULL:

select * from nameAge where age IS NULL 

Nếu bạn muốn NULL giá trị với age <> 12 giá trị, sử dụng:

select * from nameAge where age <> 12 OR age IS NULL 
+0

cảm ơn lời giải thích tốt! – canpoint

+1

Lưu ý rằng bạn có thể sử dụng '=' và '<>' khi 'ANSI_NULLS' bị tắt. –

+0

** Một phụ lục quan trọng: ** Kiểm tra 'NULL <> 12' sẽ không trả về false, nhưng sẽ trả về một giá trị boolean NULL. Được xử lý như một giá trị sai, nhưng ** không thể được phủ nhận ** Vì vậy, 'NOT (NULL <> 12)' vẫn là boolean NULL và không đúng. – Falco

8

Khái niệm

WHERE NULL <> 12 

không trả lại TRUE hoặc FALSE, nhưng thực sự trả lại UNKNOWN. Điều này có nghĩa là bản ghi thứ ba trong bảng của bạn sẽ không được trả lại bởi truy vấn của bạn.

Như @ughai đề cập, bạn nên sử dụng IS NULL thay vì để truy vấn ghi lại rằng:

SELECT * FROM nameAge WHERE age IS NULL 

Có một cái nhìn tại Microsoft SQL Server documentation để biết thêm thông tin.

+2

Theo tiêu chuẩn SQL, kết quả là 'UNKNOWN' thay vì' NULL'. [tag: mysql] conflates 'NULL' và' UNKNOWN' nhưng hầu hết các sản phẩm cơ sở dữ liệu khác (mà tôi biết) thì không. –

+0

@Damien_The_Unbeliever Cảm ơn bạn đã chỉ ra điều này và tôi đã cập nhật câu trả lời của mình bằng một liên kết đến tài liệu chính thức của Microsoft. –

4

Khi bạn đang đối phó với NULLs bạn nên luôn luôn cẩn thận vì 3 lý có giá trị sử dụng trong Sql Server (khi một vị có thể được đánh giá để TRUE, FALSE hoặc UNKNOWN). Bây giờ ở đây là một tuyên bố cổ điển select nơi nhiều người mới đến mắc lỗi, cho thấy rằng tuyên bố sẽ trả về tất cả các hàng nơi Age <> 12 bao gồm NULLs.

Nhưng nếu bạn biết thực tế dễ dàng so sánh NULL với bất kỳ giá trị nào, ngay cả đến NULL chính nó sẽ đánh giá là UNKNOWN thì càng rõ ràng điều gì đang xảy ra. Mệnh đề WHERE sẽ trả về CHỈ những hàng mà vị từ được đánh giá là TRUE. Hàng mà vị từ đánh giá là FALSE hoặc UNKNOWN sẽ được lọc ra khỏi kết quả.

Bây giờ hãy xem những gì đang diễn ra đằng sau hiện trường.Bạn có 4 hàng:

ID Name Age 
1  X  12 
2  Y  12 
3  null null 
4  Z  12 

và vị ngữ là:

where Age <> 12 

Khi bạn đánh giá vị này cho mỗi hàng bạn nhận được:

ID Name Age Evaluation result 
1  X  12 FALSE    --(because 12 <> 12 is FALSE) 
2  Y  12 FALSE    --(because 12 <> 12 is FALSE) 
3  null null UNKNOWN   --(because NULL <> 12 is UNKNOWN) 
4  Z  12 FALSE    --(because 12 <> 12 is FALSE) 

Bây giờ nhớ rằng WHERE khoản sẽ chỉ trả lại các hàng mà vị từ đánh giá là TRUE và rõ ràng là bạn sẽ không nhận được bất kỳ kết quả nào vì không có hàng nào đánh giá được TRUE.

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