跳到主要内容

SQL实战经验 - NPE问题重写

· 阅读需 3 分钟
PawSQL Team
Optimize your SQL Queries by Clicks!

问题定义

SQL的NPE(Null Pointer Exception)问题是指在SQL查询中,当聚合列全为NULL时,SUM、AVG等聚合函数会返回NULL,这可能会导致后续的程序出现空指针异常。

select sum(t.b) from (values row(1,null)) as t(a,b);

可以使用如下方式避免NPE问题:

SELECT IFNULL(SUM(t.b), 0) from (values row(1,null)) as t(a,b);

或者:

SELECT COALESCE(SUM(t.b), 0) from (values row(1,null)) as t(a,b);

或者:

SELECT case when SUM(t.b) is null then 0 else sum(t.b) end from (values row(1,null)) as t(a,b);

这会返回0而不是NULL,避免了空指针异常。

Oracle:NVL(); SQL Server和MS Access:ISNULL(); MySQL:IFNULL()或COALESCE();

重写优化

触发条件

  1. SUM或AVG聚集函数
  2. 聚集函数的参数可能全为NULL, 包括
    1. 参数是列,列定义可以为空
    2. 参数是表达式,表达式可以为空
    3. 列定义不可为空,但是是外连接的内表,结果可能为空

数据库类型及版本

  • MySQL
  • openGauss
  • Oracle
  • PostgreSQL
  • KingbaseES
  • MariaDB

关于PawSQL

PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,openGauss,Oracle等,提供的SQL优化产品包括

  • PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员,
  • PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。
  • PawSQL Engine, 是PawSQL系列产品的后端优化引擎,可以独立安装部署,并通过http/json的接口提供SQL优化服务。PawSQL Engine以docker镜像的方式提供部署安装。

联系我们