如何在分组查询中:存在null则返回null,否则返回max值?
分组查询中根据字段是否含NULL返回对应结果的正确SQL实现
你原来的SQL里ANY()函数无法正常工作,是因为ANY()通常用于子查询或与比较运算符搭配使用,不能直接用来判断分组内是否存在NULL值。以下是几种可行的实现方式:
方法一:通过CASE转换后判断最大值
select t.id, case when max(case when st.end_at is null then 1 else 0 end) = 1 then null else max(st.end_at) end as max_end_at from table as t join sub_table as st on st.table_id = t.id group by t.id;
逻辑:将st.end_at为NULL的行标记为1,非NULL标记为0,通过MAX()聚合后,若结果为1则说明分组内存在NULL,返回NULL;否则返回st.end_at的最大值。
方法二:通过COUNT对比判断
select t.id, case when count(st.end_at) != count(*) then null else max(st.end_at) end as max_end_at from table as t join sub_table as st on st.table_id = t.id group by t.id;
逻辑:count(st.end_at)会忽略NULL值,统计非NULL的行数;count(*)统计分组内所有行数。如果两者不相等,说明分组内存在NULL,返回NULL;否则返回最大值。
方法三:使用布尔聚合函数(适用于PostgreSQL)
select t.id, case when bool_or(st.end_at is null) then null else max(st.end_at) end as max_end_at from table as t join sub_table as st on st.table_id = t.id group by t.id;
逻辑:BOOL_OR()是PostgreSQL的聚合函数,只要分组内有任意一行满足st.end_at is null,就返回true,此时返回NULL;否则返回最大值。
内容的提问来源于stack exchange,提问作者fguillen
相关产品推荐
相关产品推荐

