【发布时间】:2017-01-01 00:03:39
【问题描述】:
我正试图围绕一个我认为会与实际行为不同的 MySQL 语句来思考。但我觉得official documentation 是sending 我in circles。
这就是我想要的,基本上……
SELECT * FROM table WHERE col1 = 'string' OR col2 = 'string' OR col3 = 'string';
…相反,我想避免重复不变的'string'。几天前我发现这行得通……
SELECT * FROM table WHERE col1 OR col2 OR col3 = 'string';
… 或者,它至少返回 一些 行。我假设这两个陈述是相同的——乍一看确实如此。
但今天我发现口译员把它读成……
SELECT * FROM table WHERE (col1 OR col2) OR (col3 = 'string');
现在我想知道(col1 OR col2) 的真正含义。有人可以启发我吗?我在 SO 或 Google 中找不到明确的答案。
doc 这么说……
逻辑或。当两个操作数都为非 NULL 时,如果任何操作数非零,则结果为 1,否则为 0。对于 NULL 操作数,如果另一个操作数非零,则结果为 1,否则为 NULL。如果两个操作数都为 NULL,则结果为 NULL。
...但是我不明白id OR name 和name OR owner 之间的区别(见附录)。
附录
MariaDB [test2]> select * from pets;
+----+------------+-------+
| id | name | owner |
+----+------------+-------+
| 1 | dog | pete |
| 2 | cat | erica |
| 3 | bird | maria |
| 4 | koala bear | pete |
| 5 | gorilla | joe |
| 6 | chamaelon | NULL |
| 7 | NULL | joe |
+----+------------+-------+
7 rows in set (0.00 sec)
MariaDB [test2]> select * from pets WHERE name;
Empty set, 6 warnings (0.00 sec)
MariaDB [test2]> select * from pets WHERE name OR owner;
Empty set, 12 warnings (0.00 sec)
MariaDB [test2]> select * from pets WHERE id OR name OR owner;
+----+------------+-------+
| id | name | owner |
+----+------------+-------+
| 1 | dog | pete |
| 2 | cat | erica |
| 3 | bird | maria |
| 4 | koala bear | pete |
| 5 | gorilla | joe |
| 6 | chamaelon | NULL |
| 7 | NULL | joe |
+----+------------+-------+
7 rows in set (0.02 sec)
MariaDB [test2]> select * from pets WHERE id OR name OR owner = 'joe';
+----+------------+-------+
| id | name | owner |
+----+------------+-------+
| 1 | dog | pete |
| 2 | cat | erica |
| 3 | bird | maria |
| 4 | koala bear | pete |
| 5 | gorilla | joe |
| 6 | chamaelon | NULL |
| 7 | NULL | joe |
+----+------------+-------+
7 rows in set (0.00 sec)
MariaDB [test2]> select * from pets WHERE (id OR name);
+----+------------+-------+
| id | name | owner |
+----+------------+-------+
| 1 | dog | pete |
| 2 | cat | erica |
| 3 | bird | maria |
| 4 | koala bear | pete |
| 5 | gorilla | joe |
| 6 | chamaelon | NULL |
| 7 | NULL | joe |
+----+------------+-------+
7 rows in set (0.00 sec)
【问题讨论】:
-
这是标准运算符优先级。第一个测试(col1 或 col2)是一个完整的比较,
col3 = 'string'也是如此。col1 or col2 or col3在您添加= 'string'之前有效,它本身无效。然后解析器备份,直到找到有效的col3 = 'string',然后表达式解析为(col1 or col2) or (col3 = 'string')。您应该找到 SQL 参考或教程并阅读运算符优先级,这是在解析运算符时处理运算符的方式。 -
@RyanVincent 我以为that isn't allowed。