MySql运算符的惊人行为

时间:2016-08-12 15:51:40

标签: mysql casting operator-precedence not-operator

我希望这个查询将所有列都返回为0,正确的表达式1是什么?

select (not(55))=1, !(55)=1, not(55)=1 ;

+-------------+---------+-----------+
| (not(55))=1 | !(55)=1 | not(55)=1 |
+-------------+---------+-----------+
|           0 |       0 |         1 |
+-------------+---------+-----------+

我发现这令人惊讶,不是!是不相等的,并且parens是重要的。

[编辑:简化了原帖的查询]

3 个答案:

答案 0 :(得分:1)

在你的第一列代码就像(mysql执行代码的隐式评估(55)= 0)

select  (55)=1 from dual;  /* result 0  false*/ 

然后

select  not (55)=1 from dual; /* resul  1 true alias not false */

答案 1 :(得分:0)

格雷格:

根据 IFNULL(expr1,expr2)的MYSQL文档:

  

如果expr1不为NULL,则IFNULL()返回expr1;否则它会返回   表达式2。 IFNULL()返回一个数字或字符串值,具体取决于   使用它的上下文。

参考:http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_ifnull

答案 2 :(得分:0)

在我看来,您看到的是比较=运算符的优先级高于NOT运算符:

NOT( IFNULL(55,0)) = 1相当于NOT (IFNULL(55,0)=1)

(NOT( IFNULL(55,0))) = 1相当于(NOT IFNULL(55,0)) = 1

!(IFNULL(55,0)) = 1相当于看起来像什么;并表示!的优先级高于或等于=

官方文档here证实了这一点。

我猜测!NOT的不同优先级与稍微不同的语义和两个运算符的预期用途有关。我从未尝试过,但我很确定x IS !NULLx ! IN ([set])是不允许的。