微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IN子句中为NULL或IS NULL

如何解决IN子句中为NULL或IS NULL

| 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\',\'value3\')
OR id_field IS NULL
有什么建议么?     

解决方法

           
in
语句的解析方式与
field=val1 or field=val2 or field=val3
相同。在其中放一个空值将降为
field=null
,这将不起作用。 (马克·B的评论) 我这样做是为了聪明
SELECT *
FROM tbl_name
WHERE 
(id_field IN (\'value1\',\'value2\',\'value3\') OR id_field IS NULL)
    ,        您的查询由于运算符优先级而失败。
AND
OR
之前绑定! 您需要一对括号,这不是“ clarity”的问题,而是纯逻辑上的必要性。
SELECT *
FROM   tbl_name
WHERE  other_condition = bar
AND    another_condition = foo
AND   (id_field IN (\'value1\',\'value3\') OR id_field IS NULL)
加上括号可以防止
AND
之前的
AND
绑定。如果没有其他
WHERE
条件(没有
AND
),则不需要括号。在这方面,公认的答案有点误导。     ,        
SELECT *
FROM tbl_name
WHERE coalesce(id_field,\'unik_null_value\') 
IN (\'value1\',\'value3\',\'unik_null_value\')
这样就可以消除检查中的空值。给定id_field中的空值,合并函数将代替null返回\'unik_null_value \',并且通过向IN列表中添加\'unik_null_value,查询将返回id_field为value1-3或null的帖子。     ,        丹尼尔回答的问题是完全可以的。我想留下有关NULL的注释。当列包含NULL值时,我们应谨慎使用NOT IN运算符。如果您的列包含NULL值并且您正在使用NOT IN运算符,则不会获得任何输出。这就是在http://www.oraclebin.com/2013/01/beware-of-nulls.html上的解释方式,这是一篇非常不错的文章,我从中发现并考虑过共享它。     ,        注意:由于有人声称Sushant Butta的答案中的外部链接已消失,因此我将内容张贴在此处作为单独的答案。 当心NULL。 今天,我在使用IN和
NOT IN
运算符时遇到了一个非常奇怪的查询行为。实际上,我想比较两个表,并找出
table a
中是否存在来自ѭ15value的值,并且如果该列包含
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.
现在,我们将执行查询以通过使用
IN
运算符从
table_b
中检查值来检查
table_a
中是否存在值。
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
第一个查询的行为符合预期,但是第二个查询发生了什么?为什么我们没有得到任何输出,应该怎么办?查询有什么区别吗?没有。 变化在表ѭ20的数据中。我们在表中引入了“ 17”值。但是怎么会这样呢?让我们将两个查询分为
\"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
那么我们该如何处理呢?我们将使用
NOT IN
运算符从表from20ѭ中选择所有ѭ49pick值。
SQL> select * from table_a where a not in (select * from table_b where b is not null);

         A
----------
         1
         2
因此,在使用
NOT IN
运算符时,请始终注意列中的
NULL
值。 当心NULL!     ,        我知道回答晚了,但可能对其他人有用 您可以使用子查询并将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\',0)
    ,        “ 56”是指没有数据。 “ 56”被正式定义为不可用,未分配,未知或不适用的值(OCA Oracle Database 12c,SQL基础知识我的考试指南,p87)。 因此,当使用\“ in \”或\“ not in \”子句限制所述列时,可能看不到包含空值的列的记录。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。