2013-07-26 10 views
10

Używam PostgreSQL z tego zapytaniaPostgres NOT IN (null) daje żadnego rezultatu

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

Dlaczego to dać mi żadnych wyników? Spodziewam się, aby wszystkie wiersze gdzie id nie jest null

z

(this_.ID not in (1)) 

i uzyskać oczekiwane rezultaty

Odpowiedz

16

Wynik [not] in (null) zawsze będzie zerowy. Aby porównać null trzeba is [not] null lub is [not] distinct from null

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

Jeśli chcesz where (ID not in (1,null)) jak w swoim komentarzu można zrobić

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

oznacza wybrać "wybierz * z Entity, gdzie (ID nie w (1, null))" jest niemożliwe? – wutzebaer

+1

Zaktualizowano @wutzebaer –

7

PostgreSQL używa NULL jako wartość niezdefiniowana.
To, o co prosisz, to zwrócenie pozycji, które nie znajdują się na liście lub nieokreślonej wartości. Ponieważ undefined oznacza, że ​​nie wiesz, co jest w środku, PostgreSQL nie zwraca żadnego elementu, ponieważ po prostu nie może odpowiedzieć na żądanie.
Choć wniosek:

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

może wrócić rekordy, dlatego jeżeli stwierdzi element z ID = 1 wie, że znajduje się w zbiorach
wniosek:

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

nie mogą być spełnione ponieważ wartość pusta może być dowolną wartością.

Powiązane problemy