为什么(x IS NULL!= y IS NULL)在MySQL中需要额外的括号?

时间:2016-04-03 23:02:58

标签: mysql sql null

我有一个MySQL表,其字段分组,规则是每行只使用一个组,并且该组的所有字段都是非空的。

要明确一点,让我们看看其中的一些字段

x_encrypted
x_hashed
y_encrypted
y_hashed

如果插入错误记录,我有一个触发器,表示失败。其中一项检查是

IF (x_encrypted IS NULL != x_hashed IS NULL) ... error

即。 x是加密和散列的,或者它不存在。

这会在x_encrypted IS NULL AND x_hashed IS NULL的情况下触发错误。修复是这样重写它,带有额外的括号:

IF ((x_encrypted IS NULL) != (x_hashed IS NULL)) ... error

为什么需要这些额外的括号?我看不出这在语法上是多么模糊。我担心有一个陷阱在等我,我在其他地方有类似的与NULL相关的检查我不再信任。

1 个答案:

答案 0 :(得分:3)

根据documentationIS!=具有相同的优先顺序。也:

  

对于在表达式中以相同优先级发生的运算符,评估从左到右进行,但赋值从右到左进行评估。

这意味着,这个表达式:

x_encrypted IS NULL != x_hashed IS NULL

将被评估为:

((x_encrypted IS NULL) != x_hashed) IS NULL

因此,您必须使用显式括号来覆盖默认的评估顺序。