我发现在 case语句的文档 中提到它使用短路运算符:
但以下SQL返回“除数等于零”。Oracle数据库使用短路运算。也就是说,对于一个简单的CASE表达式,数据库只在将每个comparison_expr值与表达式进行比较之前计算该值,而不是在将任何一个comparison_expr值与expr进行比较之前计算所有的comparison_expr值。因此,如果先前的comparison_expr等于expr,则Oracle不会评估comparison_expr。对于一个搜索的CASE表达式,数据库计算每个条件以确定它是否为true,并且如果前一个条件为true,则不会评估该条件。
WITH data AS (SELECT 1 AS cond, 10 AS num, 0 AS div FROM DUAL)
SELECT
CASE WHEN cond = 2 THEN (CASE WHEN MAX(div) = 0 THEN 0 ELSE SUM(num / div) END)
ELSE -1
END AS result
FROM data
GROUP BY cond
有没有什么解决方法可以避免“除数等于零”错误?
编辑
这个查询很好用:
WITH data AS (SELECT 1 AS cond, 10 AS num, 0 AS div FROM DUAL)
SELECT
CASE WHEN cond = 2 THEN (CASE WHEN MAX(div) = 0 THEN 0 ELSE 1 END)
ELSE -1
END AS result
FROM data
GROUP BY cond