Clase de error DIVIDE_BY_ZERO

SQLSTATE: 22012

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

Parámetros

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

Explicación

Azure Databricks genera este error cada vez que intenta dividir un intervalo o un valor 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. Las funciones y operadores como mod, que pueden provocar este error incluyen las 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 que provoca el error es correcta?

    Si la expresión no es correcta, corríjala para que el valor 0 no se vuelva a producir y vuelva a intentar la consulta.

  • ¿Son correctos los datos?

    Si los datos de entrada pueden dar lugar a los valores 0 que se pasan, es posible que tenga que arreglar los datos en el origen o limpiarlos antes de pasarlos a la función como argumento.

    La limpieza de datos puede significar excluir las filas incorrectas, convertir los valores 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 resultado NULL en valores alternativos como elementos neutros para la suma 0 o multiplicación 1.

Como solución de último recurso, cuando no se puede cambiar la expresión o el flujo de datos, deshabilite 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