MYSQL IN 关键字对 NULL 值的处理
SQL 查询通常使用 IN 关键字根据一组指定值来过滤结果。然而,在处理 NULL 值时,MYSQL 的 IN 关键字表现出一种需要考虑的独特行为。
问题:IN 关键字排除 NULL 值
考虑以下查询:
select count(*) from Table1 where CurrentDateTime>='2012-05-28 15:34:02.403504' and Error not in ('Timeout','Connection Error');
此查询旨在排除错误值为“超时”或“连接错误”的行,但它意外地忽略了错误为 NULL 的行。要考虑 NULL 值,必须添加附加条件(OR Error is NULL)。
排除 NULL 的原因
IN 关键字使用布尔值比较表达式 ( 1/0)。但是,在某些情况下,它可以返回 NULL 而不是布尔值。当 Error 为 NULL 时,IN 表达式变为:
Error <> 'Timeout' AND Error <> 'Connection Error'
此处应用空比较规则。由于 Error 的值为 NULL,因此表达式无法计算为 true 或 false。
包含 NULL 值的解决方案
要包含具有 NULL 值的行,可以使用以下解决方案:
与 IN 合并:
COALESCE(Error,'') not in ('Timeout','Connection Error');
OR 条件与 IS NULL :
Error IS NULL OR Error not in ('Timeout','Connection Error');
短路的 CASE 表达式:
CASE WHEN Error IS NULL THEN 1 ELSE Error not in ('Timeout','Connection Error') THEN 1 END = 1
示例
考虑以下数据:
create table tbl(msg varchar(100) null, description varchar(100) not null); insert into tbl values('hi', 'greet'), (null, 'nothing');
查询:
select 'hulk' as x, msg, description from tbl where msg not in ('bruce','banner');
将仅返回“hi”,因为 NOT IN 表达式的计算结果为 NULL对于具有 NULL 消息值的行。
结论
MYSQL 中的 IN 关键字在比较过程中将 NULL 值视为特殊情况。使用 IN 的开发人员必须意识到这种行为并实施适当的处理,以避免排除或误解具有 NULL 值的行。
以上是MYSQL 的 IN 关键字如何处理比较中的 NULL 值?的详细内容。更多信息请关注PHP中文网其他相关文章!