如何在不使用GROUP BY的情况下用COUNT函数实现特定CASE逻辑?
正确SQL写法及问题分析
为什么你的语句不对
- 语句1报错:因为你在SELECT里同时用了聚合函数
COUNT(a_code)和普通列a_code,却没加GROUP BY,Oracle不允许这种混合写法,所以抛出ORA-00937。 - 语句2逻辑错:
GROUP BY a_code是按每个a_code分组统计它的出现次数,而你要的是所有符合b_code='abc'的记录总数,这俩不是一回事,所以结果不符合需求。
两种可行的解决方案
方案1:子查询统计总条数
SELECT CASE WHEN (SELECT COUNT(*) FROM table_name WHERE b_code = 'abc') > 1 THEN 'n/a' ELSE (SELECT a_code FROM table_name WHERE b_code = 'abc') END AS result FROM dual;
先通过子查询算出符合条件的总记录数,再判断:总数超过1就输出'n/a',否则直接取出唯一的a_code。
方案2:窗口函数(更简洁)
SELECT DISTINCT CASE WHEN COUNT(*) OVER () > 1 THEN 'n/a' ELSE a_code END AS result FROM table_name WHERE b_code = 'abc';
COUNT(*) OVER ()会直接计算当前筛选结果集的总行数,不用分组;- 加
DISTINCT是因为所有行的判断结果都一样,最终只返回一条结果就行。
额外补充
如果存在符合条件的记录数为0的情况,上面两种写法都会返回NULL,要是需要处理这种场景,可以给CASE加个分支:
SELECT CASE WHEN (SELECT COUNT(*) FROM table_name WHERE b_code = 'abc') = 0 THEN '无匹配记录' WHEN (SELECT COUNT(*) FROM table_name WHERE b_code = 'abc') > 1 THEN 'n/a' ELSE (SELECT a_code FROM table_name WHERE b_code = 'abc') END AS result FROM dual;
内容的提问来源于stack exchange,提问作者Endman888
相关产品推荐
相关产品推荐

