DIVIDE_BY_ZERO錯誤類別

SQLSTATE:22012

除以零。 使用 try_divide 來容許除數為 0,並改為傳回 Null。 如有必要,請將 設定 <config> 為 「false」 以略過此錯誤。

參數

  • ansiConfig:要變更行為的組態名稱。

解釋

每當 Azure Databricks 嘗試將 INTERVAL 或數值除以 0 時,就會引發此錯誤。 此錯誤所提供的內容資訊會隔離物件和發生錯誤的運算式。 mod之類的函式和運算子,可能會導致此錯誤,包括執行除法做為較複雜公式的一部分。

緩解

錯誤的風險降低取決於原因:

  • 運算式是否導致錯誤正確?

    如果運算式不正確,請修正它 0 ,讓值無法發生,然後重試查詢。

  • 資料是否正確?

    如果輸入資料應該能夠產生 0 傳遞的值,您可能需要修正來源的資料,或在將資料傳遞至函式做為引數之前清除它。

    資料清理可能表示排除違規的資料列、使用 0NULLnullif (expr、0) ,或使用 (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