You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:36:01