IN运算符SQL

3

我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我有一个名为NUMS的表格,并且它只有一个列n。
我在其中填充了值1、2、3、4、5和null。

现在有一个查询:

SELECT n FROM Nums 
 WHERE n IN (1, 2, null)

在这种情况下,我猜它被转换为
SELECT n FROM Nums 
 Where n = 1 OR n = 2 OR n = null   

我也将n与null值进行比较,应该返回未知并返回一个空集。但它返回了1,2(虽然IN运算符中包含null,但它没有返回)。

现在有一个查询:

SELECT n FROM Nums WHERE n NOT IN(1, 2, null)  

...被转换为:

SELECT n FROM Nums 
 Where n!=1 AND n!=2 AND n!=null  

这里我上面说的东西是有效的,但它不返回任何内容。

有人能详细解释一下发生了什么吗。

7个回答

5
这是因为null=null总是false,用于null的运算符是ISIS NOT。您可以使用以下查询获取预期输出。
SELECT n FROM Nums WHERE n IN (1,2) OR n IS NULL

[编辑]感谢@Buckwad

由于第一个查询中的“n”永远不会为NULL,所以ALL谓词在这里是不明确的。 - zerkms
我认为这可以更简单地写成: SELECT n FROM Nums WHERE n IN (1,2) OR n IS NULL - Damon

2

好的,我已经找到了答案。

SELECT n FROM Nums    
WHERE n NOT IN (1, 2, null)

评估结果为

SELECT n FROM Nums  
n!=1 AND n!=2 AND n!=null

上次比较的结果总是未知的。而且AND运算的真值表显示,只要其中涉及一个未知值(U,T)(U,F),(U,U),结果只能是U或F(U=未知,F=假),因此它不会包含在结果集中。
在这种情况下,
SELECT n FROM Nums
WHERE n IN (1, 2, null) 

等同于
SELECT n FROM Nums
WHERE n = 1 OR n =2 OR n=null

现在针对n=1的行,操作n=1将为true
而对于n=2的行,操作n=2将为true
对于所有n=null的行,n将是未知的

因此,在结果集中给出1和2。
希望您们喜欢它。
请问有人可以将我的回复标记为答案吗?


只有你可以将此标记为答案,并且你必须等待两天才能这样做。 - OMG Ponies

1

你不能直接与 null 进行比较。要查找列的值是否为 null,必须使用类似于以下内容的语句:

SELECT n
FROM Nums
WHERE n IS NULL

1

虽然在IN运算符中包含了NULL,但它并没有被返回

由于n = NULL的评估结果,NULL不能与NULL相等。需要将其处理为n IS NULL(或类似的适当语法),以返回NULL行/记录。


你对集合1,2,3,4,5,null的查询应该返回所有记录,因为: 1 != 1 (false) OR 1 != 2 (true) -> 2 != 1 (true) ->以此类推 - zerkms
n==1 或者 n=2 或者 n=null 你看,我正在将所有的n与null进行比较 所以它应该返回一个空集。 - Akshay J

0
我还在将n与null值进行比较,这应该会产生未知结果,并返回一个空集。
但实际上不应该这样做。如果你需要一个额外的行填充NULL值,我认为最好的方法是:
SELECT n FROM Nums WHERE n IN(1,2)
UNION
SELECT NULL

现在有一个查询: SELECT n FROM Nums WHERE n NOT IN(1, 2, null) ...被转换为: 这里我上面说的方法是有效的,它不会返回任何东西。 没错,因为没有什么可以等于NULL,对于NULL比较,使用IS NULL语句。

我正在比较每个n(1、2、3、4、5、null),如下所示
n==1 OR n=2 OR n=null
所有的n都将返回未知,因为n=null对于所有的n都产生了未知。
就像(true/false) OR (true/false) OR (Unknown) 对于每个n。
这最终将产生未知并返回一个空集合。
- Akshay J
那又如何?我知道这个并且回答过了,“不应该”。 - zerkms
SELECT n FROM NUMS WHERE n IN(null,1,2); 它返回了1和2。 请检查。 - Akshay J
所以?我知道这个,但你想让它返回1、2和NULL。
“虽然包含在IN运算符中,但NULL没有返回”。
- zerkms
为什么 null 不会被包含进去? 答案:因为 null=null 会被计算为 UNKNOWN。同样地,1=null 应该被计算为 UNKNOWN,所以它不会返回任何内容。你知道这个吗? - Akshay J

0
 SELECT n FROM Nums  
 WHERE n IN (1, 2)
  Or n Is null

这将检索您想要获取的内容。如Mitch所说,通常与Null进行比较会产生UNKNOWN。这是因为NULL本身被定义为未定义的值。这就像说我曾经住在诺丁汉、伯明翰和某个地方。在世界地图上找到某个地方可能有点棘手,因为它是未定义的。


0
如果一个IN列表中包含任何一个NULL值,整个列表的结果就是UNKNOWN
使用正确的ANSI NULLS默认设置,当您将NULLNULL进行比较时,结果不是真的,而是UNKNOWN

SELECT n FROM NUMS WHERE n IN(null,1,2); 它返回了 1 和 2。请检查。 - Akshay J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接