首页 >数据库 >mysql教程 >MySQL 如何处理 IN 表达式中的 NULL 值?

MySQL 如何处理 IN 表达式中的 NULL 值?

Barbara Streisand
Barbara Streisand原创
2024-10-23 18:17:05432浏览

How Does MySQL Handle NULL Values in IN Expressions?

MySQL IN 关键字和 NULL 值

MySQL 中的 IN 关键字执行给定表达式和值列表之间的比较,返回布尔结果(TRUE/FALSE)。但是,在某些情况下,MySQL 以不同的方式处理 NULL 值。

考虑以下查询:

select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and Error not in ('Timeout','Connection Error');

此查询旨在从 Table1 中检索 CurrentDateTime 值大于的行“2012-05-28 15:34:02.403504”和一个不等于“超时”或“连接错误”的错误值。令人惊讶的是,此查询排除了带有 NULL 值的错误行。

为什么 MySQL 会忽略 IN 表达式中的 NULL 值?

MySQL 将 NULL 视为未知或未定义的值。当在 IN 表达式中使用时,MySQL 将 NULL 计算为既不是 TRUE 也不是 FALSE,从而导致未知结果。因此,IN 表达式本身的计算结果为 NULL。

修复查询

要检索具有 NULL 错误值的行,有多种方法:

  1. 使用 COALESCE 将 NULL 值替换为默认值:
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and COALESCE(Error,'') not in ('Timeout','Connection Error');
  1. 使用 IS NULL 和 OR 显式检查 NULL 值:
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and (Error IS NULL OR Error not in ('Timeout','Connection Error'));
  1. 使用 CASE 根据错误值分配布尔结果:
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and CASE WHEN Error IS NULL THEN 1 ELSE Error not in ('Timeout','Connection Error') THEN 1 ELSE 0 END = 1;

这些修改确保具有 NULL 错误值的行包含在查询结果中。

以上是MySQL 如何处理 IN 表达式中的 NULL 值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn