如何调整CASE语句查询以输出符合预期的多行FLAG结果?
问题分析
原查询里的CASE语句是行级判断,每一行数据只会触发一个CASE分支——只要FLAG_1-FLAG_3全为'X',就直接返回'PRE',不会再检查FLAG_4-FLAG_6的条件;再加上DISTINCT去重,自然只会返回一条结果。要让同一个NUMBER同时输出PRE和POST两条记录,得把两个条件拆成独立的查询再合并。
调整后的SQL写法
SELECT NUMBER, 'PRE' AS FLAG FROM TABLE WHERE FLAG_1='X' AND FLAG_2='X' AND FLAG_3='X' UNION ALL SELECT NUMBER, 'POST' AS FLAG FROM TABLE WHERE FLAG_4='X' AND FLAG_5='X' AND FLAG_6='X'
补充说明
- 用
UNION ALL而非UNION:UNION会自动去重,而如果同一个NUMBER同时满足两个条件,我们需要保留两条记录,UNION ALL不会去重,执行效率也更高。 - 如果需要同时输出不满足任何条件的'NA'记录,可以追加第三个分支:
SELECT NUMBER, 'PRE' AS FLAG FROM TABLE WHERE FLAG_1='X' AND FLAG_2='X' AND FLAG_3='X' UNION ALL SELECT NUMBER, 'POST' AS FLAG FROM TABLE WHERE FLAG_4='X' AND FLAG_5='X' AND FLAG_6='X' UNION ALL SELECT NUMBER, 'NA' AS FLAG FROM TABLE WHERE NOT (FLAG_1='X' AND FLAG_2='X' AND FLAG_3='X') AND NOT (FLAG_4='X' AND FLAG_5='X' AND FLAG_6='X')
内容的提问来源于stack exchange,提问作者team 9
相关产品推荐
相关产品推荐

