admin

有什么可移植的方式来表达与空列表相同的IN条件?

sql

例如,()适用于sqllite3

select *
from orders
where custid = ?
and status in ()

但是它失败了postgres

ksysdb=# select code, applicable_objecttype 
from pssystem_ktagtype where applicable_objecttype in ();

ERROR:  syntax error at or near ")"
LINE 1: ...pe from pssystem_ktagtype where applicable_objecttype in ();

使用(null)使postgres感到高兴,并且似乎不打扰sqllite3:

ksysdb=# select code, applicable_objecttype 
from pssystem_ktagtype where applicable_objecttype in (null);
code | applicable_objecttype
------+-----------------------
(0 rows)

但是它可以在SQL Server和Oracle上运行吗?ANSI
SQL有什么要说的?我的猜测是null永远不会匹配任何东西(包括null它自己),因此 in列表 条件将始终评估为false。


阅读 179

收藏
2021-06-07

共1个答案

admin

IN (NULL)在Postgres,SQL Server,Oracle,MariaDB,MySQL和SQLite中应该没问题。至少我无法在SQL
Fiddle
db <> fiddle上产生任何错误。

设置:

CREATE TABLE a
             (a varchar(1));
INSERT INTO a
            (a)
            VALUES ('a');
SELECT *
       FROM a
       WHERE a IN (NULL);
2021-06-07