Share via


Classe d’erreur DIVIDE_BY_ZERO

SQLSTATE : 22012

Division par zéro Utilisez try_divide pour tolérer le diviseur 0 et retourner la valeur NULL à la place. Si nécessaire, définissez <config> sur « false » pour contourner cette erreur.

Paramètres

  • ansiConfig : nom de la configuration pour modifier le comportement.

Explication

Azure Databricks déclenche cette erreur à chaque tentative de division d’un INTERVALLE, ou d’une valeur numérique par 0. Les informations de contexte fournies avec cette erreur isolent l’objet et l’expression dans laquelle l’erreur s’est produite. Les fonctions et les opérateurs tels que mod, qui peuvent provoquer cette erreur, incluent ceux qui effectuent une division dans le cadre de formules plus complexes.

Limitation des risques

Le mode d’atténuation de l’erreur dépend de sa cause :

  • L’expression à l’origine de l’erreur est-elle correcte ?

    Si l’expression est incorrecte, corrigez-la de sorte que la valeur 0 soit impossible et réessayez la requête.

  • Les données sont-elles correctes ?

    Si les données d’entrée doivent être en mesure d’entraîner la transmission des valeurs 0, vous devrez peut-être corriger les données à la source ou les nettoyer avant de transmettre les données à la fonction en tant qu’argument.

    Le nettoyage des données peut signifier exclure les lignes incriminées, pour convertir les valeurs 0 en NULL en utilisant nullif(expr, 0) ou pour convertir les données en une autre valeur acceptable à l’aide de if(expr = 0, alt, expr).

Si l’expression et les données sont correctes et que vous souhaitez que la division par zéro soit tolérée, vous pouvez utiliser try_divide. En guise d’alternative, remplacez l’argument par nullif(expr, 0). L’expression renvoie alors NULL au lieu d’une erreur. Si vous préférez, vous pouvez utiliser nvl(try_divide(expr1, expr2), alt) afin de transformer les valeurs NULL de sortie en valeurs alternatives telles que des éléments neutres pour l’addition 0 ou la multiplication 1.

En guise de solution de dernier recours, lorsque l’expression ou le flux de données ne peut pas être modifié, vous pouvez désactiver ce comportement ANSI en définissant le paramètre ansiconfig sur false. Notez que ce paramètre a des conséquences au-delà de la condition d’erreur immédiate.

Exemples

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