DIVIDE_BY_ZERO třída chyby
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
naNULL
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
Související
- operátor % (znak procenta)
- operátor / (lomítko)
- ANSI_MODE
- , pokud funkce
- mod funkce
- funkce nvl
- funkce try_divide