【问题标题】:MySQL: select * from table where col IN (null, "") possible without ORMySQL:select * from table where col IN (null, "") possible without OR
【发布时间】:2011-01-10 00:11:50
【问题描述】:

是否可以在不使用 or 的情况下在 MySQL 中对空字符串和 NULL 值进行选择?

这个:

   select * from table where col IN (null, "");

不起作用,它会忽略 null(或可能将其与字符串 'null' 匹配)。

【问题讨论】:

    标签: mysql null


    【解决方案1】:
    SELECT  *
    FROM    mytable
    WHERE   COALESCE(col, '') = ''
    

    但是请注意,如果对列进行索引,查询将比OR 更有效:

    SELECT  *
    FROM    mytable
    WHERE   col = '' OR col IS NULL
    

    这将在索引上使用ref_or_null 访问路径。

    如果您需要从值列表中选择NULLs,只需将所有非空值放入列表中并添加单个OR IS NULL 条件:

    SELECT  *
    FROM    mytable
    WHERE   col IN ('val1', 'val2', 'val3') OR col IS NULL
    

    这也将使用col 上的索引。

    【讨论】:

    • 我为了简洁而忽略了它,但实际上我的查询是:select * from table where col IN ("", NULL, "a", "b", "c", "few更多选择”);这仍然可以正确使用索引吗? ( col in (list) or IS NULL )
    • 在 NULL 在 IN() 内的情况下使用索引还是仅在 NULL 与 IN() 进行 ORed 时使用索引?
    • @henno: col IN (NULL) 永远不会匹配,即使col 为空。与是否使用索引无关。
    • 我猜原因是Mysql的内部逻辑会看到一个值为null,而不去测试它是否在列出的值中?
    • @MaxWilliams:原因是 SQL 是这样设计的。 NULL = NULL 不是真或假,它是 NULL。如果您进行这样的查询:SELECT * FROM mytable WHERE col = NULL,它将永远不会返回任何记录,甚至不会返回值 col 设置为 NULL 的记录。所有 SQL 数据库的行为都是如此,而不仅仅是 MySQL。
    【解决方案2】:

    如果其他人像我一样正在寻找这个解决方案;如果您按多列搜索,则需要将 where/or 语句分组在括号中。

    这不会返回您期望的结果:

    SELECT * 
    FROM table 
    WHERE col1 IN ('val1', 'val2') OR col1 IS NULL AND col2 IN ('val3', 'val4')
    

    “OR col1 IS NULL”将完全覆盖您的“AND col2 IN”语句。

    将 col1 的所有条件放在括号内即可:

    SELECT * 
    FROM table 
    WHERE (col1 IN ('val1', 'val2') OR col1 IS NULL) AND col2 IN ('val3', 'val4') 
    

    我花了一段时间才考虑尝试这个,因为(至少根据我的经验)您通常不会将 WHERE 语句放在括号中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2018-12-04
      相关资源
      最近更新 更多