如何编写SQL语句在满足全部指定条件时返回1?
解决方案
你需要的是整体判断所有账户是否都满足各自条件,而非逐行检查单个账户。原CASE语句只处理了单条记录的情况,无法实现全局校验,以下是两种可行方案:
方案一:通过统计符合条件的行数判断
利用SUM和COUNT对比,确认所有行都满足对应条件:
SELECT 1 FROM hour_counts HAVING COUNT(*) = SUM( CASE WHEN ACCOUNT = 'A' AND hour_count = 24 THEN 1 WHEN ACCOUNT = 'B' AND hour_count = 24 THEN 1 WHEN ACCOUNT = 'C' AND hour_count > 22 THEN 1 WHEN ACCOUNT = 'D' AND hour_count > 22 THEN 1 ELSE 0 END )
- 逻辑:
CASE给符合条件的行标记1,不符合的标记0;SUM结果等于总行数COUNT(*)时,说明所有账户都满足要求,此时返回1;若不满足则无结果返回。
方案二:通过不存在不符合条件的记录判断
用NOT EXISTS检查是否存在违规记录,无违规则返回1:
SELECT 1 WHERE NOT EXISTS ( SELECT 1 FROM hour_counts WHERE NOT ( (ACCOUNT = 'A' AND hour_count = 24) OR (ACCOUNT = 'B' AND hour_count = 24) OR (ACCOUNT = 'C' AND hour_count > 22) OR (ACCOUNT = 'D' AND hour_count > 22) ) )
- 逻辑:子查询筛选出所有不满足条件的账户,若不存在这类账户(
NOT EXISTS),则返回1。
补充:需要返回0的场景
如果要求不满足条件时返回0而非无结果,可调整语句:
SELECT CASE WHEN COUNT(*) = SUM( CASE WHEN ACCOUNT = 'A' AND hour_count = 24 THEN 1 WHEN ACCOUNT = 'B' AND hour_count = 24 THEN 1 WHEN ACCOUNT = 'C' AND hour_count > 22 THEN 1 WHEN ACCOUNT = 'D' AND hour_count > 22 THEN 1 ELSE 0 END ) THEN 1 ELSE 0 END AS check_result FROM hour_counts
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

