SQL:选择(null = null);

12
这是一道数据库考试题目,以下是一个有效的 SQL 语句,请问它会输出什么?请解释你的答案! SELECT (NULL = NULL); 在 psql 8.4.11 中,该语句的输出结果为: ?column? ---------- (1 row) 我可以轻松地输出这个语句的结果,但我不知道它为什么是这个答案... 我本来以为它会尝试计算括号内的表达式并得出真/假,但显然它没有这样做。请问它的行为原因是什么呢? 谢谢。

澄清我的问题:看起来结果是1个空行。我不能/不想改变我的查询语句,因为它是由考试练习给出的。但是这是从哪里来的?为什么结果不是空的...? - tannerli
1
@nonnb:不,null != null(或者使用SQL标准中指定的不等运算符 null <> null)也既不是真也不是假,因为你不能说两个未知值已知不相等。请参见@Oded的答案。 - kgrittn
请允许我扩展这个问题...那么select ARRAY[null]::bigint[] && ARRAY[null]::bigint[]呢? - Victor
2个回答

10

NULL代表"未知值"。不知道一个值是真还是假或其他什么。

因此,当比较两个未知值时,答案会是什么?UnknownA是否等于UnknownB?

答案?未知...

这里有一个SQL Server的示例:

IF (NULL = NULL)
  PRINT 'Equals'

IF (NULL != NULL)
  PRINT 'Not Equals'


IF (NULL IS NULL)
  PRINT 'IS'

IF (NULL IS NOT NULL)
  PRINT 'IS NOT'
唯一被打印的东西是:IS

我对这个问题的理解是:为什么我不能像 select 1 = 1 这样做来产生 truefalse 呢? - juergen d
+1 另外,如果已知一个值,“select (1=null)”会返回NULL答案。 - valex
@juergend 如果你没有使用 MS SQL,那么你可以这样做。 - Dmytro Shevchenko
1
@juergend - 这个问题特别涉及到NULL的行为。 - Oded
所以它实际上确实评估了表达式,但结果是NULL,这也是有道理的。 - tannerli
你可能想要扩展你的答案,包括 IS DISTINCT FROMIS NOT DISTINCT FROM - kgrittn

1

我猜,预期的答案是NULL。这就是MySQL的做法。实际上,PostgreSQL也是如此返回的。可能你的SQL客户端只是没有显示唯一返回值为NULL的单行。

然而,MS SQL服务器没有布尔类型,因此它不能仅选择布尔表达式的结果。因此,在MS SQL中的结果是一个错误。

问题的重点是检查您在SQL中对NULL逻辑的理解。与=不同,当与NULL进行比较时,应使用IS运算符(除非在MySQL中设置了ANSI_NULLS选项为true)。


你可以使用 IF (NULL = NULL) - Oded
@Oded 这将返回 false。 - Dmytro Shevchenko
就像 IF (NULL != NULL) 一样。 - Oded
啊,你可能是指在MS SQL服务器中。你应该明确说明。 - Dmytro Shevchenko
@Shedal:这个问题被标记为关于PostgreSQL而不是SQL Server。PostgreSQL的行为符合标准要求,因此它应该在某种程度上推广…… - kgrittn

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