为什么SQL中CASE满足第一个条件后查询仍返回两条结果?
问题原因分析
首先明确:CASE表达式的短路执行逻辑是对每行数据单独生效,不会限制全表只返回1条匹配结果,出现两条返回记录的核心原因如下:
- 你的WHERE条件会对
ap_magazyny表的每一行独立计算CASE的返回值:
某行满足第一个WHEN条件,CASE返回1,该行被保留;其他行不满足第一个WHEN条件时,会继续判断第二个WHEN条件,如果也满足返回1,同样会被保留。两条返回记录分别命中了不同的CASE分支,和CASE的短路逻辑并不冲突。 - 第二个WHEN条件中的
rownum = 1用法不符合预期:
rownum是Oracle为结果集临时分配的顺序编号,你将它写在单行判断条件中时,不会限制全局只返回1条结果,只会筛选出「全表扫描/索引扫描顺序下的第一行」中满足atrybut_t01 = value2的行,这行也会和第一个WHEN匹配到的行一起被返回。
另外补充优化点:你代码中select SUBSTR(...) from dual完全没必要,SUBSTR是标量函数,可以直接在条件中调用,不需要额外查询DUAL表,会增加不必要的性能开销。
预期逻辑的实现方案
如果你需要的逻辑是「优先返回第一个WHEN条件匹配的行,第一个条件无匹配时才返回第二个WHEN条件的1条结果」,可以改用优先级排序后取首行的写法:
select KOD from ( select KOD from ap_magazyny mag order by case when (value1 like 'ZZ%' and mag.KOD like SUBSTR(value1,INSTR(value1,'/',1)+1,3)) then 1 when (atrybut_t01 = value2) then 2 else 3 end asc ) where rownum = 1
内容的提问来源于stack exchange,提问作者Southsun1
相关产品推荐
相关产品推荐

