Oracle CASE在GROUP BY中短路未生效

3
我发现在 case语句的文档 中提到它使用短路运算符:

Oracle数据库使用短路运算。也就是说,对于一个简单的CASE表达式,数据库只在将每个comparison_expr值与表达式进行比较之前计算该值,而不是在将任何一个comparison_expr值与expr进行比较之前计算所有的comparison_expr值。因此,如果先前的comparison_expr等于expr,则Oracle不会评估comparison_expr。对于一个搜索的CASE表达式,数据库计算每个条件以确定它是否为true,并且如果前一个条件为true,则不会评估该条件。

但以下SQL返回“除数等于零”。
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
1个回答

3

使用

CASE WHEN cond = 2 
     THEN SUM(case when div = 0 then 0 else num / div end)
     ELSE -1
END

谢谢,非常棒,它还解决了在第二种情况下找到div = 0的问题(+1) - Miquel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接