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

时间:2018-06-30 19:04:58

标签: 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本身),因此列表中的条件总是会为false。

2 个答案:

答案 0 :(得分:1)

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

设置:

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

答案 1 :(得分:0)

也许您可以执行一个子查询,该查询返回空列表: 选择 * 从订单 哪里= 和状态(选择...)

而且我不理解您要实现的目标,在空列表中执行操作始终会返回False。