我有一个 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 相关检查,但我不再信任这些检查。
最佳答案
根据documentation 、 IS
和 !=
具有相同的优先级。另外:
For operators that occur at the same precedence level within an expression, evaluation proceeds left to right, with the exception that assignments evaluate right to left.
这意味着这个表达式:
x_encrypted IS NULL != x_hashed IS NULL
将被评估为:
((x_encrypted IS NULL) != x_hashed) IS NULL
因此,您必须使用显式括号来覆盖默认的求值顺序。
关于mysql - 为什么 MySQL 中 (x IS NULL != y IS NULL) 需要额外的括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36392338/