Postgresql

為什麼我的 SELECT 查詢不返回空值?

  • July 3, 2020

我有以下 SQL 腳本:

CREATE temporary table if not EXISTS the_values (
key SERIAL,
value INTEGER NULL 
);

insert into the_values(value) values (null),(1),(null),(2),(3),(4),(5),(6),(10),(null),(null);

select * 
from the_values 
where value not in (1,2,3,4,5,6,10); 

我注意到查詢:

select * 
from the_values 
where value not in (1,2,3,4,5,6,10); 

不返回具有valueNULL 的行,這引起了我的注意。因此,我想知道為什麼會這樣。我對這種現象的技術方面更感興趣,而不是明顯的解決方案:

select * 
from the_values 
where value not in (1,2,3,4,5,6,10) 
  or value IS NULL; 

如果我們將插入和查詢簡化為:

insert into T(x) values (null),(1);

select x from T where x not in (1);

對於 null,謂詞將評估為:

select x from T where null not in (1) <=>
select x from T where not null in (1) <=>
select x from T where not null <=>
select x from T where null

因此該行不滿足謂詞。如果您嘗試將某些內容與 null 進行比較(將其視為未知),則結果將為 null。

對於 1,謂詞將評估為:

select x from T where 1 not in (1) <=>
select x from T where False

因此該行也不滿足謂詞

即你最終得到一個空的結果

引用自:https://dba.stackexchange.com/questions/270265