列名为布尔值?这是什么意思?

时间:2017-01-01 00:03:40

标签: mysql boolean

我试图围绕一个我认为会表现得与实际不同的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 namename 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)

1 个答案:

答案 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