2013-07-26 43 views
10

Tôi đang sử dụng Postgres với truy vấn nàyPostgres logic NOT IN (null) không đưa ra kết quả

select 
* 
from Entity this_ 
where 
(this_.ID not in (null)) 

Tại sao điều này cho tôi không có kết quả? Tôi mong chờ để có được tất cả các hàng nơi id không phải là null

với

(this_.ID not in (1)) 

tôi nhận được kết quả mong đợi

Trả lời

16

Kết quả của [not] in (null) sẽ luôn luôn được null. Để so sánh null bạn cần is [not] null hay is [not] distinct from null

select * 
from Entity this_ 
where this_.ID is not null 

Nếu bạn muốn where (ID not in (1,null)) như trong bình luận của bạn, bạn có thể làm

where ID is not null and ID not in (1) 
+0

có nghĩa là một lựa chọn như "chọn * từ thực thể ở đâu (ID không trong (1, null))" là không thể? – wutzebaer

+1

@wutzebaer Đã cập nhật –

7

PostgreSQL sử dụng NULL là giá trị không xác định.
Những gì bạn đang yêu cầu là trả lại các mục không có trong danh sách hoặc giá trị không xác định. Vì không xác định có nghĩa là bạn không biết những gì bên trong, PostgreSQL không trả về bất kỳ mục nào vì đơn giản là không thể trả lời yêu cầu.
Trong khi yêu cầu:

select * from Entity where id in (1, null) 

có thể trả lại hồ sơ, vì nếu nó tìm thấy một yếu tố với ID = 1 biết đó là trong bộ sưu tập
yêu cầu:

select * from Entity where (ID not in (1, null)) 

có thể không được thỏa mãn bởi vì giá trị null có thể là bất kỳ giá trị nào.

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