如果列表中的值为null,则NOT IN返回false

时间:2013-11-26 05:54:15

标签: sql oracle oracle11g null

CUSTOMERS TABLE

CUSTOMER_ID FIRST_NAME     LAST_NAME         DOB        PHONE

1           John            Brown         1/1/1965  800-555-1211
2           Cynthia         Orange        2/5/1968  800-555-1212
3           Steve           White         3/16/1971 800-555-1213
4           Gail            Black                   800-555-1214
5           Doreen          Blue          5/20/1970 
6           Fred            Brown         1/1/1970  800-555-1215

如果运行查询

select * from customers where customer_id not in (2,3,5,NULL);

我得到输出没有返回行.....请帮我解决这个问题..

4 个答案:

答案 0 :(得分:4)

你被SQL 3值逻辑所困扰。

对于customer_id为2,3或5的行,WHERE子句的计算结果为false,如预期的那样。

对于其他行,它的计算结果为UNKNOWN(或NULL;我不知道Oracle是否区分它们),为true。

如果IN表达式扩展为(customer_id != 2) AND (customer_id != 3) AND (customer_id != 5) AND (customer_id != NULL),则可能会更清楚。对于customer_id的1,4或6,前三个子表达式按照您的预期评估为真。但是最后一个评估为未知,因为NULL(未知值的标记)可能“真的”为1,4或6.因此,整个表达式有一个未知数真相价值。 SELECT语句只返回WHERE子句绝对正确但未知的行。

您可以通过查询获得所需的结果。

select * from customers where customer_id not in (2, 3, 5) and customer_id is not null;

但是,您的customer_id似乎是一个自动增量列,无论如何都不能为空。如果是这样,请写下:

select * from customers where customer_id not in (2, 3, 5);

答案 1 :(得分:2)

在这个特定的例子中,您正在寻找

select * from customers where customer_id not in (2,3,5);

在这种情况下,将省略null。

为什么?

正如here所解释的那样,A Not In语句确实如此:

select * where CustomerID <> 2 and CustomerID <> 3 and CustomerID <> 5 and CustomerID <> NULL

使用默认的ansi_nulls表示法,customerID&lt;&gt; NULL将导致UNKNOWN。当SQL具有UNKNOWN时,它将不返回任何行。当它关闭时,它将返回true。

此时您有两种选择:

  1. 将语句更改为不包含空值
  2. 更改数据库引擎以关闭ansi_nulls
  3. 我认为在这种情况下,1将是更容易的选择......

答案 2 :(得分:0)

试试这个

select * from customers where customer_id not in (2,3,5);

答案 3 :(得分:0)

您的陈述

select * from customers where customer_id in (2,3,5,NULL) 

等于

    select * where CustomerID = 2 or CustomerID = 3 or CustomerID = 5 or CustomerID = NULL

最后一个表达式“CustomerID = NULL”返回始终 FALSE,但由于OR条件,这确实会影响结果。

你必须这样写:

select * from customers where customer_id in (2,3,5) or customer_id IS NULL