【发布时间】:2011-01-10 00:11:50
【问题描述】:
是否可以在不使用 or 的情况下在 MySQL 中对空字符串和 NULL 值进行选择?
这个:
select * from table where col IN (null, "");
不起作用,它会忽略 null(或可能将其与字符串 'null' 匹配)。
【问题讨论】:
是否可以在不使用 or 的情况下在 MySQL 中对空字符串和 NULL 值进行选择?
这个:
select * from table where col IN (null, "");
不起作用,它会忽略 null(或可能将其与字符串 'null' 匹配)。
【问题讨论】:
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 上的索引。
【讨论】:
col IN (NULL) 永远不会匹配,即使col 为空。与是否使用索引无关。
NULL = NULL 不是真或假,它是 NULL。如果您进行这样的查询:SELECT * FROM mytable WHERE col = NULL,它将永远不会返回任何记录,甚至不会返回值 col 设置为 NULL 的记录。所有 SQL 数据库的行为都是如此,而不仅仅是 MySQL。
如果其他人像我一样正在寻找这个解决方案;如果您按多列搜索,则需要将 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 语句放在括号中。
【讨论】: