我一直都明白,该CASE
语句遵循“短路”原则,因为如果先前步骤被评估为真,则不会对后续步骤进行评估。(此答案是否 SQL Server CASE 语句评估所有条件或在第一个 TRUE 条件时退出?相关但似乎并未涵盖这种情况并且与 SQL Server 相关)。
在以下示例中,我希望MAX(amount)
根据开始日期和支付日期之间的月份数计算不同月份之间的月份范围。
(这显然是一个构建的示例,但该逻辑在我看到问题的实际代码中具有有效的业务推理)。
如果开始日期和支付日期之间的时间小于 5 个月,则将使用表达式 1,否则将使用表达式 2。
这会导致错误“ORA-01428:参数‘-1’超出范围”,因为 1 条记录的数据条件无效,导致 ORDER BY 的 BETWEEN 子句的开头为负值。
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 ×1