IN子句为NULL或IS NULL

时间:2011-06-15 17:59:18

标签: sql postgresql null conditional-statements in-clause

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

有什么建议吗?

7 个答案:

答案 0 :(得分:85)

  

in语句将与field=val1 or field=val2 or field=val3完全相同地进行解析。将null置于其中将归结为field=null,这将无效。

Comment Marc B

我会为clairity

这样做
SELECT *
FROM tbl_name
WHERE 
(id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)

答案 1 :(得分:18)

由于operator precedence,您的查询失败。 ANDOR之前绑定!{。} 你需要一对括号,这不是“清晰度”的问题,而是纯粹的逻辑必然性

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),您将不会需要括号。接受的答案在这方面有点误导。

答案 2 :(得分:7)

丹尼尔回答的问题非常好。我想留下关于NULLS的说明。当列包含NULL值时,我们应该小心使用NOT IN运算符。如果列包含NULL值并且您正在使用NOT IN运算符,则不会获得任何输出。这是在http://www.oraclebin.com/2013/01/beware-of-nulls.html这里解释的,这是一篇非常好的文章,我偶然发现并想过分享它。

答案 3 :(得分:7)

SELECT *
FROM tbl_name
WHERE coalesce(id_field,'unik_null_value') 
IN ('value1', 'value2', 'value3', 'unik_null_value')

这样你就可以从支票中消除空值。给定id_field中的空值,coalesce函数将返回null而不返回'unik_null_value',并且通过将'unik_null_value添加到IN列表,查询将返回id_field为value1-3或null的帖子。

答案 4 :(得分:2)

注意:由于有人声称外部链接在 Sushant Butta 回答中已经死亡,因此我将此处的内容作为单独的答案发布。

谨防 NULLS

今天,我在使用IN和NOT IN运算符时遇到了一种非常奇怪的查询行为。实际上,我想比较两个表,并查看table b中是否存在来自table a的值,如果该列包含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_a运算符从table_b检查其值,从而检查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

产出符合预期。现在,我们将在表null中插入table_b值,并查看上述两个查询的行为。

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不会在此处产生问题,因为我的前两个操作数将评估为truefalse。但我的第三个操作数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 null运算符时从表table_b中选择所有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 !!

答案 5 :(得分:0)

我知道回答的时间已晚,但可能对其他人有用 您可以使用子查询并将null转换为0

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regsecret

答案 6 :(得分:0)

import os,sys,inspect current_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) unittests_dir = os.path.dirname(current_dir) bin_dir = os.path.dirname(unittests_dir) sys.path.insert(0, bin_dir) import file 表示没有数据。 Null被正式定义为不可用,未分配,未知或不适用的值(OCA Oracle Database 12c,SQL基础知识我的考试指南,p87)。 因此,当使用“ in”或“ not in”子句限制所述列时,您可能看不到包含空值的列的记录。