Sdílet prostřednictvím


DIVIDE_BY_ZERO třída chyby

SQLSTATE: 22012

Dělení nulou. Pomocí try_divide tolerujte, že dělitel je 0, a místo toho vrátí hodnotu NULL. V případě potřeby nastavte <config> na 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 číslo hodnotou 0. Kontextové informace poskytnuté touto chybou izolují objekt a výraz, ve kterém došlo k chybě. 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 příčinou chyby správně?

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

  • Jsou data správná?

    Pokud mají vstupní data možnost způsobit předání hodnot 0, možná budete muset opravit data ve zdroji nebo je vyčistit, než je předáte funkci jako argument.

    Čištění dat může znamenat vyloučení problematických řádků, převést hodnoty 0 na NULL pomocí nullif(výraz, 0), nebo převést data na jinou přijatelnou hodnotu pomocí if(výraz = 0, alt, výraz).

Pokud je 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(výraz, 0). To způsobí, aby výraz vrátil hodnotu NULL místo chyby. Pokud chcete, můžete použít nvl(try_divide(výraz1, výraz2), alt) ke změně výsledného NULL na alternativní hodnoty, jako jsou neutrální prvky pro sčítání 0 nebo násobení 1.

Pokud se výraz nebo tok dat nedá změnit, můžete toto chování ANSI zakázat nastavením poskytnutého ansiconfig na false. Všimněte si, že toto nastavení je následný 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