Megosztás a következőn keresztül:


DIVIDE_BY_ZERO hibaosztály

SQLSTATE: 22012

Osztás nullával. A használatával try_divide elviselhető, hogy az osztó értéke 0, és null értéket ad vissza. Ha szükséges, állítsa a "false" értéket <config> a hiba megkerüléséhez.

Paraméterek

  • ansiConfig: A konfiguráció neve a viselkedés módosításához.

Magyarázat

Az Azure Databricks ezt a hibát akkor észleli, amikor intervallumot vagy számokat próbál meg elosztani a következővel 0: . Az ezzel a hibával megadott környezeti információk elkülönítik azt az objektumot és kifejezést, amelyen belül a hiba történt. Olyan függvények és operátorok, mint a mod, amelyek ezt a hibát okozhatják, az összetettebb képletek részeként osztást végző függvények.

Kezelés

A hiba elhárítása az októl függ:

  • Helyes-e a hibát okozó kifejezés?

    Ha a kifejezés helytelen, javítsa ki, hogy az 0 érték ne fordul elő, majd próbálkozzon újra a lekérdezéssel.

  • Helyesek az adatok?

    Ha a bemeneti adatoknak képesnek kell lenniük az 0 értékek átadására, előfordulhat, hogy ki kell javítania az adatokat a forrásnál, vagy meg kell tisztítania, mielőtt argumentumként átadja az adatokat a függvénynek.

    Az adattisztítás azt jelentheti, hogy kizárja a jogsértő sorokat, nullif(expr, 0) használatával konvertálja az 0 értékeketNULL, vagy ha(expr = 0, alt, expr) használatával konvertálja az adatokat egy másik elfogadható értékre.

Ha a kifejezés és az adatok helyesek, és nullával szeretné tolerálni az osztást, használhatja a try_divide. Alternatív megoldásként módosítsa az argumentumot nullif(expr, 0) értékre. Ez azt eredményezi, hogy a kifejezés hiba helyett visszatér NULL . Ha szeretné, ue nvl(try_divide(expr1, expr2), alt) értékre állíthatja az eredményül NULL kapott értéket egy alternatív értékké, például semleges elemekké összeadás 0 vagy szorzás 1céljából.

Végső megoldásként, ha a kifejezés vagy az adatfolyam nem módosítható, letilthatja ezt az ANSI-viselkedést a megadott ansiconfig értékre falseállításával. Vegye figyelembe, hogy ez a beállítás az azonnali hibafeltételen túli következmény.

Példák

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