小编Bri*_*nge的帖子

意外的 CASE 评估逻辑

我一直都明白,该CASE语句遵循“短路”原则,因为如果先前步骤被评估为真,则不会对后续步骤进行评估。(此答案是否 SQL Server CASE 语句评估所有条件或在第一个 TRUE 条件时退出?相关但似乎并未涵盖这种情况并且与 SQL Server 相关)。

在以下示例中,我希望MAX(amount)根据开始日期和支付日期之间的月份数计算不同月份之间的月份范围。

(这显然是一个构建的示例,但该逻辑在我看到问题的实际代码中具有有效的业务推理)。

如果开始日期和支付日期之间的时间小于 5 个月,则将使用表达式 1,否则将使用表达式 2

这会导致错误“ORA-01428:参数‘-1’超出范围”,因为 1 条记录的数据条件无效,导致 ORDER BY 的 BETWEEN 子句的开头为负值。

查询 1

SELECT ref_no,
       CASE WHEN MONTHS_BETWEEN(paid_date, start_date) < 5 THEN
-- Expression 1
          MAX(amount)
             OVER (PARTITION BY ref_no ORDER BY paid_date ASC 
             ROWS BETWEEN MONTHS_BETWEEN(paid_date, start_date) PRECEDING
             AND CURRENT ROW)
       ELSE
-- Expression 2
           MAX(amount)
             OVER (PARTITION BY ref_no ORDER BY paid_date ASC 
             ROWS …
Run Code Online (Sandbox Code Playgroud)

oracle

8
推荐指数
1
解决办法
858
查看次数

标签 统计

oracle ×1