我认为这可能是PostgreSQL的错误,但是我在这里发布了它,以防万一我丢失了一些东西。当我的WHERE子句有一个NOT IN ()子句时,null在列表中包含该子句将不再是真实的。下面是我的问题的一个愚蠢的例子。
=# select 1 where 1 not in (1);
?column?
----------
(0 rows)
=# select 1 where 1 not in (2);
?column?
----------
1
(1 row)
=# select 1 where 1 not in (null);
?column?
----------
(0 rows)
=# select 1 where 1 not in (null, 2);
?column?
----------
(0 rows)
=# select 1 where 1 not in (2, null);
?column?
----------
(0 rows)
=# select 1 where 1 not in (2, 3);
?column?
----------
1
(1 row)
Run Code Online (Sandbox Code Playgroud)
因此where 1 not in (1),由于1在列表中,所以按预期返回0行,由于不在列表中,所以按预期where 1 not in (2)返回1行,即使不在1列表中,也where 1 not in (null)返回0行1。
这不是PostgreSQL错误。
问题在于,这NOT IN只是一个用于测试所有不平等现象的简短版本。
1 NOT IN (null, 2) 等效于:
1 <> null
AND
1 <> 2
Run Code Online (Sandbox Code Playgroud)
但是,NULL是一个特殊值,1 <> null本身NULL(不是TRUE)也是如此。请参阅文档:
不要写expression = NULL,因为NULL不等于NULL。(空值表示一个未知值,并且未知两个未知值是否相等。)
据我所知,这是标准的SQL行为。
PostgreSQL还有一个额外的关键字来检查值是否不同于null:
1 IS DISTINCT FROM NULL会是TRUE。
| 归档时间: |
|
| 查看次数: |
31 次 |
| 最近记录: |