Compartir a través de


Clase de error DIVIDE_BY_ZERO

SQLSTATE: 22012

División por cero. Use try_divide para tolerar que el divisor sea 0 y devuelva NULL en su lugar. Si es necesario, establezca <config> en "false" para omitir este error.

Parámetros

  • ansiConfig: el nombre de la configuración para cambiar el comportamiento.

Explicación

Azure Databricks genera este error cada vez que intenta dividir un INTERVALO o numérico por 0. La información de contexto proporcionada con este error aísla el objeto y la expresión en la que se produjo el error. Funciones y operadores como mod, que pueden causar este error, incluyen aquellos que realizan la división como parte de fórmulas más complejas.

Mitigación

La mitigación del error depende de la causa:

  • ¿La expresión provoca el error es correcta?

    Si la expresión es incorrecta, corríjala para que el valor 0 no pueda ocurrir, y vuelva a intentar la consulta.

  • ¿Los datos son correctos?

    Si los datos de entrada deben ser capaces de dar lugar a que se pasen los valores de 0, es posible que tenga que corregir los datos en el origen o limpiarlos antes de pasar los datos a la función como argumento.

    La limpieza de datos puede significar excluir las filas incorrectas, convertir los valores de 0 en NULL mediante nullif(expr, 0)o convertir los datos en otro valor aceptable mediante if(expr = 0, alt, expr).

Si la expresión y los datos son correctos y desea tolerar la división por cero, puede usar try_divide. Como alternativa, cambie el argumento a nullif(expr, 0). Esto hará que la expresión devuelva NULL en lugar de un error. Si lo prefiere, puede usar nvl(try_divide(expr1, expr2), alt) para convertir el valor NULL resultante en valores alternativos, como elementos neutros de la suma 0 o la multiplicación 1.

Como solución de último recurso, cuando no se puede cambiar la expresión o el flujo de datos, puede deshabilitar este comportamiento ANSI estableciendo el ansiconfig proporcionado en false. Tenga en cuenta que esta configuración es consecuencial más allá de la condición de error inmediata.

Ejemplos

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