【问题标题】:How to understand such where-in clause as where col01 in (true)?如何理解 where col01 in (true) 这样的 where-in 子句?
【发布时间】:2020-02-26 17:22:26
【问题描述】:

假设有一个名为tab01 的表,并且它在varchar 类型中有一个名为col01 的列。和语句如下所示。

# the first statement
SELECT * FROM tab01 WHERE col01 IN (TRUE);
# the second statement
SELECT * FROM tab01 WHERE col01 IN (FALSE);
# the third statement
SELECT * FROM tab01 WHERE col01 IN ('val01');

来自MySQL 5.7 Reference Manual,这三个语句的形式为bit_expr [NOT] IN (expr [, expr] ...)。在我的直觉中,只要将expr 评估为True,就应该返回该行。

为什么第一条语句什么也不返回?在我看来,第一条语句SELECT * FROM tab01 WHERE col01 IN (TRUE); 应该返回所有记录,而第二条语句SELECT * FROM tab01 WHERE col01 IN (FALSE); 应该什么也不返回。我在这个MySQL 5.7 Reference Manual 中找不到任何线索。

【问题讨论】:

  • COL01 的数据类型是什么,该列中存在哪些可能的值?
  • 请分享表结构和一些示例数据,以便其他人可以重现您的问题
  • 如果你不明白重写它是可以理解的..
  • @SalmanA col01的数据类型是字符串。

标签: mysql where-in


【解决方案1】:

对于 MySql,TRUE 等于 1 和 FALSE 等于 0。
所以第一条语句相当于:

SELECT * FROM tab01 WHERE col01 IN (1);

除非列 col01 包含等于 1 的值(或以 1 开头,然后包含非数字字符),否则您将不会得到任何返回。
第二条语句相当于:

SELECT * FROM tab01 WHERE col01 IN (0);

如果列col01 不包含等于0 的值,不会也不会返回任何内容,但是在这种情况下,如@中所述987654321@的文档,还有其他因素需要考虑。
假设列的col01数据类型为varchar,对比:

col01 IN (0)

会将col01 隐式转换为INTEGER,除非col01 的值以数字字符开头,否则此转换的结果将始终为0,因此比较的结果将为@ 987654340@.
因此,您的第二条语句将正常返回所有行。

【讨论】:

    【解决方案2】:

    在 MySQL 中,TRUE 的计算结果为 1。所以第一个查询相当于:

    SELECT * FROM tab01 WHERE col01 = 1;
    

    第二个语句的意思是:

    SELECT * FROM tab01 WHERE col01 = 0;
    

    如果col01 不是数字,MySQL 将在比较之前进行转换。当被比较的数值为 0(通常:'a' = 0 为真)时,这可能会导致令人惊讶的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      相关资源
      最近更新 更多