标准SQL布尔运算符IS与等于(=)运算符的区别

33
在SQL的Wikipedia页面上有一些关于SQL中布尔逻辑的真值表。[1] 维基百科页面似乎是引用了SQL:2003标准。
等号(=)的真值表与SQL:2003草案中IS运算符的不同。
此外,维基百科文章指出,“IS NULL” (<null predicate>)是一个特殊情况。
在SQL:2003中,似乎存在一个“IS”运算符,它像AND、NOT和OR一样是一个常规运算符。然而,<null predicate>仍然存在。
当IS是一个常规布尔运算符时,为什么会有<null predicate>呢?这是为了确保您可以使用“IS NULL”结构与非布尔值而不需要类型转换吗?是否不鼓励使用“=NULL”?
SQL:2011标准是否有不同的工作方式?
[1]: SQL的维基百科 [2]: SQL:2011草案 PDF第335页
[3]: SQL:2003草案 PDF第397页

7
甚至 NULL 也不等于 NULL。所以 NULL = NULLNULL = 11 = NULL 都是假的(实际上它们都是 NULLUnknown,这并不是真的,非常接近于假)。但是 NULL IS NULL 是真的。 - MatBailie
我们应该在第335页看什么?你确定页码没错吗?那是关于<from clause>的。 - Martin Smith
@MartinSmith:2011版本的页码在PDF和纸质版之间有所不同。因此,当我说“PDF页面”时,我指的是使用PDF阅读器“转到”第335页时得到的页面。我使用Evince和Adobe获得相同的页面,因此我认为这是一种可靠的方法。 - Janus Troelsen
@MartinSmith 打印页码:312 - Janus Troelsen
@ShamsulArefin,你能否帮我更新它们?然后我会审核你的更新是否可接受。如果不可接受,我会要求你更加努力。通过为我工作,你可以提高自己作为人的价值。如果你不为我工作,你将永远无法提高。 - Janus Troelsen
显示剩余3条评论
2个回答

30

这对我来说是一个新的问题。

如果我理解正确,<boolean value expression>语法仅定义了三个与boolean数据类型相关的谓词,即IS TRUEIS FALSEIS UNKNOWN

它们与相应的等式谓词不同之处在于,它们仅评估为TrueFalse,永远不会是Unknown。例如,UNKNOWN = TRUE会评估为UNKNOWN,但是UNKNOWN IS TRUE会评估为False

IS=的完整真值表如下。

+---------+-------+-------+---------+
|   IS    | TRUE  | FALSE | UNKNOWN |
+---------+-------+-------+---------+
| TRUE    | TRUE  | FALSE | FALSE   |
| FALSE   | FALSE | TRUE  | FALSE   |
| UNKNOWN | FALSE | FALSE | TRUE    |
+---------+-------+-------+---------+

与...相反

+---------+---------+---------+---------+
|    =    |  TRUE   |  FALSE  | UNKNOWN |
+---------+---------+---------+---------+
| TRUE    | TRUE    | FALSE   | UNKNOWN |
| FALSE   | FALSE   | TRUE    | UNKNOWN |
| UNKNOWN | UNKNOWN | UNKNOWN | UNKNOWN |
+---------+---------+---------+---------+

1
请注意,运算符为“IS TRUE”、“IS FALSE”、“IS NULL”和“IS UNKNOWN”。它们是一元运算符,将LHS表达式与RHS条件进行比较。IS表必须按照“运算符在顶部,操作数在侧面”的方式进行阅读;UNKNOWN IS UNKNOWN计算结果为TRUE。此外,请注意LHS可以是“行类型”(可能不是正确的技术术语),然后评估会针对LHS中的每个项目进行。此外,运算符可以被否定,“IS NOT NULL”、“IS NOT TRUE”、“IS NOT FALSE”、“IS NOT UNKNOWN”。这可能会导致严重的问题。(续) - Jonathan Leffler
1
继续上文:如果使用一行数据,'row IS NOT NULL' 和 'NOT (row IS NULL)' 不一定是相同的答案。我认为区别在于,如果某些列不为空,则 'NOT (row IS NULL)' 会计算为 true,但是 'row IS NOT NULL' 只有在所有列都不为空时才会计算为 true。对于单个值来说,它们是相同的;但对于多个值来说,它们不一定相同。 - Jonathan Leffler
@JonathanLeffler 标准(2003年和2011年)使用术语“IS布尔运算符”。如果它们是独立的一元运算符,难道不应该使用复数形式吗?请参见印刷页码281上的第6.34节“<布尔值表达式>”。 - Janus Troelsen
1
@JonathanLeffler 还可以参考第8.7节的<null predicate>和表格14(打印页398),其中似乎只有R IS NULLNOT R IS NULLR IS NOT NULLNOT R IS NOT NULL是特殊情况,这意味着IS NOT TRUE等类似情况将不会被<null predicate>(特殊)语义所解释,而是通过<boolean value expression>语义来解释,这似乎使IS NOT UNKNOWN等同于IS UNKNOWN(在“通用规则”项目2中提到了281页)。 - Janus Troelsen
@JonathanLeffler 标准中的所有真值表都不是非对称的,因此不支持您关于重要参数顺序的主张(除了“<null predicate>”情况,其中顺序显然很重要,因为它不再是运算符)。 - Janus Troelsen
这些注释中的参考是针对链接的SQL:2003草案的。 - Janus Troelsen

6
如上海报所述,null = null是不正确的。它会返回NULL(false)。
在进行null比较时,您必须使用IS NULLIS NOT NULL

2
It will return NULL(false)不是一个有效的语句。NULL !== FALSENULL !== TRUENULL !== NULL。它只是未定义。” - Fr0zenFyr

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