Postgresql
為什麼我的 SELECT 查詢不返回空值?
我有以下 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);
不返回具有
value
NULL 的行,這引起了我的注意。因此,我想知道為什麼會這樣。我對這種現象的技術方面更感興趣,而不是明顯的解決方案: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
因此該行也不滿足謂詞
即你最終得到一個空的結果