这是一道数据库考试题目,以下是一个有效的 SQL 语句,请问它会输出什么?请解释你的答案!
SELECT (NULL = NULL);
在 psql 8.4.11 中,该语句的输出结果为:
?column?
----------
(1 row)
我可以轻松地输出这个语句的结果,但我不知道它为什么是这个答案... 我本来以为它会尝试计算括号内的表达式并得出真/假,但显然它没有这样做。请问它的行为原因是什么呢?
谢谢。
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
这样做来产生 true
或 false
呢? - juergen dNULL
的行为。 - OdedNULL
,这也是有道理的。 - tannerliIS DISTINCT FROM
和 IS NOT DISTINCT FROM
。 - kgrittn我猜,预期的答案是NULL
。这就是MySQL的做法。实际上,PostgreSQL也是如此返回的。可能你的SQL客户端只是没有显示唯一返回值为NULL
的单行。
然而,MS SQL服务器没有布尔类型,因此它不能仅选择布尔表达式的结果。因此,在MS SQL中的结果是一个错误。
问题的重点是检查您在SQL中对NULL逻辑的理解。与=
不同,当与NULL
进行比较时,应使用IS
运算符(除非在MySQL中设置了ANSI_NULLS
选项为true)。
IF (NULL = NULL)
。 - OdedIF (NULL != NULL)
一样。 - Oded
null != null
(或者使用SQL标准中指定的不等运算符null <> null
)也既不是真也不是假,因为你不能说两个未知值已知不相等。请参见@Oded的答案。 - kgrittnselect ARRAY[null]::bigint[] && ARRAY[null]::bigint[]
呢? - Victor