DIVIDE_BY_ZERO錯誤類別
除以零。 使用 try_divide
來容許除數為 0,並傳回 NULL。
如有必要,請將 <config>
設為 「false」 以略過此錯誤。
參數
- ansiConfig:要變更行為的組態名稱。
解釋
每當 Azure Databricks 嘗試將 INTERVAL 或數值除以 0
時,就會引發此錯誤。
此錯誤所提供的內容資訊會隔離發生錯誤的物件和表達式。
像 mod這類執行除法作為較複雜公式一部分的函式和運算符,可能會導致此錯誤。
減緩
錯誤的緩解取決於原因:
表示式是否導致錯誤正確?
如果表達式不正確,請修正它,讓
0
值無法發生,然後重試查詢。數據是否正確?
如果輸入數據應該能夠產生可以被傳遞的
0
值,您可能需要修正來源的數據,或在將數據作為參數傳遞至函式之前加以清理。數據清理可能表示排除違規的數據列、使用
0
將NULL
值轉換成 ,或使用 if(expr = 0, alt, expr)將數據轉換成另一個可接受的值。
如果表示式和資料正確,而且您想要容忍零除法,您可以使用 try_divide。
或者,請將 自變數變更為 nullif(expr, 0)。
這會導致表達式傳回 NULL
,而不是錯誤。
如果您願意,您可以使用 nvl(try_divide(expr1,expr2),alt),將結果 NULL
轉換為替代值,例如用於加法的中性元 0
或用於乘法的中性元 1
。
作為最後手段的解決方案,當表達式或數據流無法變更時,您可以將提供的 ansiconfig
設定為 false
來停用此 ANSI 行為。 請注意,此設定 超出的立即錯誤狀況。
例子
-- A DIVIDE_BY_ZERO in a embedded in view. The context information isolates the faiing function.
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1/val FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
[DIVIDE_BY_ZERO] Division by zero. To return NULL instead, use `try_divide`. If necessary set "spark.sql.ansi.enabled" to false (except for ANSI interval type) to bypass this error.
== SQL of VIEW v(line 1, position 7) ==
SELECT 1/val FROM VALUES(1), (0) AS T(val)
^^^^^
-- Tolerating division by zero by turning the result to NULL using try_divide.
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT try_divide(1, val) FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
1
NULL
-- Tolerating division by zero by turning the result to NULL using nullif
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1 / nullif(val, 0) FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
1
NULL
-- Filtering out offensive rows
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1/val FROM VALUES(1), (0) AS T(val) WHERE val != 0;
> SELECT c1 FROM v;
1
-- Turning division by zero into division by a small number.
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1 / if(val = 0, 1e-10, val) FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
1
10000000000
-- Turning division by zero into a neutral element for addition.
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT nvl(try_divide(1, val), 0) FROM VALUES(1), (0) AS T(val);
> SELECT c1 FROM v;
1
0
-- Disabling ANSI mode in Databricks SQL for the view definition only.
> SET ANSI_MODE = false;
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1/val FROM VALUES(1), (0) AS T(val);
> SET ANSI_MODE = true;
> SELECT c1 FROM v;
1
NULL
-- Disabling ANSI mode in Databricks Runtime for the view definition only.
> SET spark.sql.ansi.enabled = false;
> CREATE OR REPLACE TEMPORARY VIEW v(c1) AS SELECT 1/val FROM VALUES(1), (0) AS T(val);
> SET spark.sql.ansi.enabled = true;
> SELECT c1 FROM v;
1
NULL