【问题标题】:Column name as Boolean? What does it mean?列名作为布尔值?这是什么意思?
【发布时间】:2017-01-01 00:03:39
【问题描述】:

我正试图围绕一个我认为会与实际行为不同的 MySQL 语句来思考。但我觉得official documentationsendingin 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 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)

【问题讨论】:

  • 这是标准运算符优先级。第一个测试(col1 或 col2)是一个完整的比较,col3 = 'string' 也是如此。 col1 or col2 or col3 在您添加 = 'string' 之前有效,它本身无效。然后解析器备份,直到找到有效的col3 = 'string',然后表达式解析为(col1 or col2) or (col3 = 'string')。您应该找到 SQL 参考或教程并阅读运算符优先级,这是在解析运算符时处理运算符的方式。
  • @RyanVincent 我以为that isn't allowed

标签: mysql boolean


【解决方案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-ing 表达式,然后再在where 子句中使用它,这样您就可以看到要使用的值。

例子:

select name OR owner

【讨论】:

  • "先选择表达式" » 我什至不知道这是可能的。很好的建议!
猜你喜欢
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
相关资源
最近更新 更多