DIVIDE_BY_ZERO třída chyby

SQLSTATE: 22012

Dělení nulou. Slouží try_divide k tolerování dělitele 0 a vrácení hodnoty NULL. Pokud je to nutné, nastavte <config> hodnotu false, aby se tato chyba vynechala.

Parametry

  • ansiConfig: Název konfigurace pro změnu chování.

Vysvětlení

Azure Databricks vyvolá tuto chybu pokaždé, když se pokusí dělit interval nebo číselnou hodnotu .0 Kontextové informace poskytnuté s touto chybou izolují objekt a výraz, ve kterém k chybě došlo. Funkce a operátory, jako je mod, které můžou způsobit tuto chybu, zahrnují ty, které provádějí dělení jako součást složitějších vzorců.

Zmírnění

Zmírnění chyby závisí na příčině:

  • Je výraz způsobující chybu správný?

    Pokud je výraz nesprávný, opravte ho tak, aby se 0 hodnota nemohla objevit, a zkuste dotaz zopakovat.

  • Jsou data správná?

    Pokud by vstupní data měla mít za následek 0 předání hodnot, možná budete muset opravit data ve zdroji nebo je před předáním dat funkci jako argumentu vyčistit.

    Čištění dat může znamenat vyloučení urážlivých řádků, převedení 0 hodnot na NULL použití nullif(expr, 0) nebo převod dat na jinou přijatelnou hodnotu pomocí if(expr = 0, alt, výraz).

Pokud jsou výraz a data správná a chcete tolerovat dělení nulou, můžete použít try_divide. Jako alternativu změňte argument na nullif(expr, 0). To způsobí, že výraz vrátí místo NULL chyby. Pokud dáváte přednost, můžete ue nvl(try_divide(výraz1, výraz2), alt) převést výsledek NULL na alternativní hodnoty, jako jsou neutrální prvky pro sčítání 0 nebo násobení 1.

V krajním případě, když výraz nebo tok dat nelze změnit, můžete toto chování ANSI zakázat nastavením poskytnuté ansiconfig hodnoty na false. Všimněte si, že toto nastavení je závažné nad rámec okamžité chybové podmínky.

Příklady

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