MYSQL 的 IN 关键字如何处理比较中的 NULL 值?

Linda Hamilton
发布: 2024-10-23 21:43:30
原创
308 人浏览过

How Does MYSQL's IN Keyword Handle NULL Values in Comparisons?

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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!