DIVIDE_BY_ZERO felklass

SQLSTATE: 22012

Division med noll. Använd try_divide för att tolerera att divisor är 0 och returnera NULL i stället. Om det behövs anger du <config> "false" för att kringgå det här felet.

Parametrar

  • ansiConfig: Namnet på konfigurationen för att ändra beteendet.

Förklaring

Azure Databricks genererar det här felet när det försöker dividera ett INTERVALL eller numeriskt med 0. Kontextinformationen som tillhandahålls med det här felet isolerar objektet och uttrycket där felet inträffade. Funktioner och operatorer som mod, som kan orsaka det här felet, inkluderar de som utför division som en del av mer komplexa formler.

Lindring

Hur du åtgärdar felet beror på orsaken:

  • Orsakar uttrycket felet korrekt?

    Om uttrycket är felaktigt korrigerar det så 0 att värdet inte kan inträffa och försök igen.

  • Är data korrekta?

    Om indata ska kunna resultera i att 0 värdena skickas kan du behöva antingen korrigera data vid källan eller rensa dem innan du skickar data till funktionen som ett argument.

    Datarensning kan innebära att de felande raderna undantas, att värdena konverteras 0 till NULL att använda nullif(expr, 0) eller att konvertera data till ett annat acceptabelt värde med if(expr = 0, alt, expr).

Om uttrycket och data är korrekta och du vill tolerera divisionen med noll kan du använda try_divide. Alternativt ändrar du argumentet till nullif(expr, 0). Detta gör att uttrycket returneras NULL i stället för ett fel. Om du föredrar att du kan ue nvl(try_divide(expr1, expr2), alt) för att omvandla resultatet NULL till alternativa värden, till exempel neutrala element för addition 0 eller multiplikation 1.

När uttrycket eller dataflödet inte kan ändras som en sista utväg kan du inaktivera ansi-beteendet genom att falseange som ansiconfig . Observera att den här inställningen är följdriktig utöver det omedelbara feltillståndet.

Exempel

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