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);
我得到输出没有返回行.....请帮我解决这个问题..
答案 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 :(得分: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