聚合函数(MAX 等)返回 NULL 而不是没有行

Posted

技术标签:

【中文标题】聚合函数(MAX 等)返回 NULL 而不是没有行【英文标题】:Aggregate functions (MAX, etc.) return NULL instead of no rows 【发布时间】:2021-06-06 05:14:33 【问题描述】:

当没有行与给定条件匹配时,如何使聚合函数(例如,MAX)不返回行而不是 NULL

例如,以下查询返回一行:

SELECT MAX(salary)
FROM hr.employees
WHERE department_id = '11111'

使用GROUP BY () 没有帮助:

SELECT MAX(salary)
FROM hr.employees
WHERE department_id = '11111'
GROUP BY ()

如何让它不返回任何行(选择 0 行,NO_DATA_FOUND)?

我正在使用 Oracle Database 12c。

【问题讨论】:

【参考方案1】:

使用having 子句:

SELECT MAX(salary)
FROM hr.employees
WHERE department_id = '11111'
HAVING COUNT(*) > 0;

请注意,department_id 看起来像一个数字。如果是这样,比较应该是一个数字 - 即去掉 11111 周围的单引号。

【讨论】:

【参考方案2】:

使用MINUS:

SELECT MAX(salary)
FROM hr.employees
WHERE department_id = '11111'
MINUS
SELECT NULL FROM DUAL;

db小提琴here

【讨论】:

【参考方案3】:

SELECT NVL(MAX(salary),0) FROM hr.employees WHERE department_id = '11111'

这将返回为 0 值,然后您可以执行进一步的操作,希望有所帮助。

【讨论】:

问题是“如何让它返回 0 行?”这将返回包含 0 的行,而不是返回 0 行。

以上是关于聚合函数(MAX 等)返回 NULL 而不是没有行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库:聚合函数的使用

开窗函数

MYSQL查询--聚合函数查询

Sql 复习

MYSQL单表查询

SqlServer函数的聚合函数