在添加 WHERE 子句以过滤派生列中的非空值时,我在 Oracle 中遇到被零除错误,即使内部查询已经过滤掉分母为零的情况。在没有附加 WHERE 子句的类似查询中不会出现此问题。
这是有效的查询:
SELECT * FROM (
SELECT 1/ s_qty AS ratio FROM (
SELECT SUM(qty) AS s_qty FROM custom_table GROUP BY user
) WHERE s_qty <> 0
)
添加 WHERE 子句来检查比率 IS NOT NULL 会引入错误:
SELECT * FROM (
SELECT 1/ s_qty AS ratio FROM (
SELECT SUM(qty) AS s_qty FROM custom_table GROUP BY user
) WHERE s_qty <> 0
) WHERE ratio IS NOT NULL
将WHERE子句改为HAVING子句就可以解决问题,这很奇怪。
SELECT * FROM (
SELECT 1/ s_qty AS ratio FROM (
SELECT SUM(qty) AS s_qty FROM custom_table
GROUP BY user
HAVING SUM(qty) <> 0
)
) WHERE ratio IS NOT NULL
这似乎与优化器的工作方式有关。 其他数据库也有这个问题吗? 是否有配置更改或提示可以解决此问题,例如调整优化器设置?
我认为第一个查询并没有真正起作用。你在哪里运行它?大多数客户端(例如 TOAD)不会显示整个结果,即它们仅获取前 500 行,但当您在结果网格中向下滚动时,您会看到相同的错误。
您的查询可以写得更简单,如
SELECT 1/NULLIF(SUM(qty), 0) as ratio
FROM custom_table
GROUP BY user