MySQL比较优先级/重言式

时间:2014-05-26 04:11:08

标签: mysql boolean-expression

我正在玩MySQL并且想知道为什么以下语句返回所有行,这意味着WHERE子句始终为true。 为简单起见,我在这里使用公共沙箱: http://headfirstlabs.com/sql_hands_on

SELECT * FROM drink_info where color = '' = '';
SELECT * FROM drink_info where color = '' = 'x';
SELECT * FROM drink_info where color = 'x' = 'x';
SELECT * FROM drink_info where color = 'x' = 'y';
SELECT * FROM drink_info where color = true = false;
SELECT * FROM drink_info where color = false = true;

但是,WHERE子句使用以下值计算为false:

SELECT * FROM drink_info where color = true = true;
SELECT * FROM drink_info where color = false = false;

这会导致错误,因为我期待:

SELECT * FROM drink_info where color = false := false;

1 个答案:

答案 0 :(得分:1)

MySQL为相同的运算符从左到右评估表达式。如果它们是不同的运算符当然运算符优先级接管。但是,当使用与示例中相同的运算符时,a + b + c的评估方式就像您已完成(a + b) + c一样。

更容易看出你是否使用数字:

mysql> select 1 = 2 = 2;
+-----------+
| 1 = 2 = 2 |
+-----------+
|         0 |
+-----------+

mysql> select 1 = (2 = 2);
+-------------+
| 1 = (2 = 2) |
+-------------+
|           1 |
+-------------+

在第一个示例中,(1 = 2)求值为0,然后将此结果与2进行比较。它们不相等,因此总结果为false,在MySQL中与0相同。

但在第二个例子中,(2 = 2)的计算结果为真,或1.然后将1与最左边的1进行比较,结果为真,或为1.

对于color = true = truecolor = false = false的示例,如果color的值为0,则两个表达式都将为false。


重新评论:

  

我认为一切都是> 0和任何字符串值等于true。

否,如果字符串包含前导数字,则在数字上下文中计算的字符串值可以是数字,但如果没有数字,则默认为0。例如,字符串'123abc'是数字123,但字符串'abc'是数字0.

在您的示例color = 'x' = 'x'中,第一个比较为false,因为我假设颜色不等于'x'。 MySQL中的真假都是整数1和0(这不是标准SQL)。因此,第二个比较是将0与'x'进行比较,将'x'放入数值表达式中,因此它为0.这使得完整表达式0 = 0为真。