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

标签 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 相关检查,但我不再信任这些检查。

最佳答案

根据documentationIS!= 具有相同的优先级。另外:

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/

相关文章:

mysql - SQL 带计数的连续记录

php - SQL 逻辑和/或带有/乘法和加法的 PHP 应用程序(我采用的方法是正确的还是完全错误的?)

c++ - 不确定如何在 C++ 中处理这种模式

MYSQL:想要将日期列设为NULL

mysql - 我怎样才能得到这个答案+ mysql中的查询

php - 为什么要使用 num_rows

php - 当右表中的记录不可用时,Laravel 左连接返回空结果

mysql - 查询数据包过大 MySQL

mysql - 缩短这个小查询

c++ - 我应该写 `0x0` 还是 `0` 而不是 NULL?