DIVIDE_BY_ZERO 错误条件

SQLSTATE:22012

被零除。 请改用 try_divide 以容忍除数为 0,并返回 NULL。 如有必要,请将 <config> 设置为“false”以绕过此错误。

参数

  • ansiConfig:要更改行为的配置的名称。

说明

每当 Azure Databricks 尝试将 INTERVAL 或数值除以 0时,都引发此错误。 此错误提供的上下文信息将隔离发生错误的对象和表达式。 可能导致此错误的函数和运算符,如mod,包括那些在更复杂公式中执行除法的函数和运算符。

缓解措施

错误的缓解取决于原因:

  • 导致错误的表达式是否正确?

    如果表达式不正确,请修改,使 0 值不会出现,然后重试查询。

  • 数据是否正确?

    如果输入数据应该能够导致 0 传递的值,则可能需要修复源中的数据,或在将数据作为参数传递给函数之前对其进行清理。

    数据清理可能意味着删除有问题的行,使用nullif(expr, 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