Поделиться через


класс ошибок DIVIDE_BY_ZERO

SQLSTATE: 22012

Деление на ноль. Используйте , try_divide чтобы разрешить делитель иметь значение 0 и вместо этого возвращать ЗНАЧЕНИЕ NULL. При необходимости задайте значение <config> false, чтобы обойти эту ошибку.

Параметры

  • ansiConfig: имя конфигурации для изменения поведения.

Объяснение

Azure Databricks вызывает эту ошибку всякий раз, когда пытается разделить ИНТЕРВАЛ или числовое значение на 0. Сведения о контексте, предоставленные с этой ошибкой, изолируют объект и выражение, в котором произошла ошибка. Функции и операторы, такие как mod, которые могут вызвать эту ошибку, включают те, которые выполняют деление как часть более сложных формул.

Смягчения

Устранение ошибки зависит от причины:

  • Правильно ли выражение вызывает ошибку?

    Если выражение неверно, исправьте его, поэтому 0 значение не может возникнуть, и повторите запрос.

  • Правильно ли данные?

    Если входные данные должны привести к передаче значений, может потребоваться либо исправить данные в источнике, либо очистить их перед передачей данных в функцию в 0 качестве аргумента.

    Очистка данных может означать исключение строк, связанных с ошибкой, преобразование 0 значений в NULL с помощью nullif(expr, 0) или преобразование данных в другое допустимое значение с помощью if(expr = 0, alt, expr).

Если выражение и данные верны и вы хотите разрешить деление на ноль, можно использовать try_divide. В качестве альтернативы измените аргумент на nullif(expr, 0). Это приведет к возврату NULL выражения вместо ошибки. Если вы предпочитаете, можно использовать ue nvl(try_divide(expr1, expr2), alt), чтобы преобразовать результирующий NULL объект в альтернативные значения, такие как нейтральные элементы для сложения 0 или умножения 1.

В качестве решения в крайнем случае, если выражение или поток данных не могут быть изменены, можно отключить это поведение ANSI, задав для предоставленного ansiconfig значения falseзначение . Обратите внимание, что этот параметр не связан с непосредственным условием ошибки.

Примеры

-- 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