Postgres是数据库
是否可以对 IN 子句使用 NULL 值?示例:
SELECT *
FROM tbl_name
WHERE id_field IN ('value1', 'value2', 'value3', NULL)
我想限制在这四个值。
我已经尝试了上述语句,但它不起作用,它执行但不添加带有 NULL id_fields 的记录。
我也尝试添加一个 OR 条件,但这只会让查询运行并且看不到尽头。
SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND id_field IN ('value1', 'value2', 'value3')
OR id_field IS NULL
有什么建议吗?
in
语句将以相同的方式解析为field=val1 or field=val2 or field=val3
。将 null 放入其中将归结为field=null
这将不起作用。
(马克·
我会这样做是为了千里眼
SELECT *
FROM tbl_name
WHERE
(id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)
运算符优先级,查询失败。 AND
在 OR
之前绑定 !
你需要一对括号,这不是"清晰"的问题,而是纯粹的逻辑必要性。
SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND (id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL);
添加的括号可防止AND
OR
之前绑定。如果没有其他WHERE
条件(没有AND
(,则不需要额外的括号。在这方面,公认的答案具有误导性。
SELECT *
FROM tbl_name
WHERE coalesce(id_field,'unik_null_value')
IN ('value1', 'value2', 'value3', 'unik_null_value')
以便从检查中消除空值。给定 id_field 中的空值,合并函数将代替空返回"unik_null_value",并且通过将"unik_null_value"添加到 IN-list,查询将返回id_field值为 1-3 或 null 的帖子。
丹尼尔回答的问题非常好。我想留下一个关于空值的注释。当列包含 NULL 值时,我们应该小心使用 NOT IN 运算符。如果您的列包含 NULL 值并且您使用的是 NOT IN 运算符,则不会获得任何输出。这就是 http://www.oraclebin.com/2013/01/beware-of-nulls.html 在这里的解释,一篇非常好的文章,我遇到了并想分享它。
注意:由于有人声称外部链接在Sushant Butta的答案中已经死了,我在这里发布了内容作为单独的答案。
当心空值。
今天,我在使用 IN 和 NOT IN
运算符时遇到了非常奇怪的查询行为。实际上,我想比较两个表,并找出table a
中是否存在table b
值,并找出该列是否包含null
值的行为。所以我只是创建了一个环境来测试这种行为。
我们将创建表table_a
。
SQL> create table table_a ( a number);
Table created.
我们将创建表table_b
。
SQL> create table table_b ( b number);
Table created.
在table_a
中插入一些值。
SQL> insert into table_a values (1);
1 row created.
SQL> insert into table_a values (2);
1 row created.
SQL> insert into table_a values (3);
1 row created.
在 table_b
中插入一些值。
SQL> insert into table_b values(4);
1 row created.
SQL> insert into table_b values(3);
1 row created.
现在,我们将执行一个查询,通过使用运算符检查table_b
的值来检查table_a
中是否存在IN
值。
SQL> select * from table_a where a in (select * from table_b);
A
----------
3
执行以下查询以检查不存在。
SQL> select * from table_a where a not in (select * from table_b);
A
----------
1
2
输出如预期的那样。现在我们将在表table_b
中插入一个null
值,看看上述两个查询的行为方式。
SQL> insert into table_b values(null);
1 row created.
SQL> select * from table_a where a in (select * from table_b);
A
----------
3
SQL> select * from table_a where a not in (select * from table_b);
no rows selected
第一个查询的行为符合预期,但第二个查询发生了什么变化?为什么我们没有得到任何输出,应该发生什么?查询有什么区别吗?没有。
更改在表 table_b
的数据中。我们在表中引入了一个null
值。但是它为什么会这样呢?让我们将两个查询拆分为 "AND"
和"OR"
运算符。
第一个查询:
第一个查询将在内部处理,如下所示。因此,null
不会在这里产生问题,因为我的前两个操作数将评估为 true
或false
。但是我的第三个操作数a = null
既不会评估为true
也不会false
。它将仅评估为null
。
select * from table_a whara a = 3 or a = 4 or a = null;
a = 3 is either true or false
a = 4 is either true or false
a = null is null
第二个查询:
第二个查询将按如下方式处理。由于我们使用的是 "AND"
运算符,并且任何操作数中除 true
以外的任何操作数都不会给我任何输出。
select * from table_a whara a <> 3 and a <> 4 and a <> null;
a <> 3 is either true or false
a <> 4 is either true or false
a <> null is null
那么我们如何处理呢?我们将在使用运算符时从表 table_b
中选取所有not null
值NOT IN
。
SQL> select * from table_a where a not in (select * from table_b where b is not null);
A
----------
1
2
因此,在使用运算符时,请务必注意列中的NULL
值NOT IN
。
小心空!!
回答晚了,但可能对其他人有用您可以使用子查询并将 null 转换为 0
SELECT *
FROM (SELECT CASE WHEN id_field IS NULL
THEN 0
ELSE id_field
END AS id_field
FROM tbl_name) AS tbl
WHERE tbl.id_field IN ('value1', 'value2', 'value3', 0)
Null
是指缺少数据。 Null
被正式定义为不可用、未分配、未知或不适用的值(OCA Oracle Database 12c,SQL Fundamentals I Exam Guide,p87(。因此,当使用"in"或"not in"子句限制所述列时,您可能看不到包含空值的列的记录。
简单:这将给出 TRUE 和 null 值:
SELECT *
FROM tbl_name
WHERE
id_field IN ('value1', 'value2', 'value3') IS NOT FALSE;