我试图围绕一个我认为会表现得与实际不同的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说明了这个......
逻辑OR。当两个操作数都为非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)
答案 0 :(得分:1)
请改用:
SELECT * FROM table WHERE 'string' IN (col1, col2, col3)
由于name
列中的值未评估为1,因此您案例中的id OR name
评估为1,这意味着您的查询与
select * from pets WHERE 1
同样,因为owner
列中的值没有计算为1,name OR owner
的计算结果为0,这意味着您的查询与
select * from pets WHERE 0
我建议select
首先使用表达式,然后在where
子句中使用它,这样就可以看到将要使用的值。
示例:
select name OR owner