Dela via


"DIVIDE_BY_ZERO" fel-klass

SQLSTATE: 22012

Division med noll. Använd try_divide för att tolerera att divisor-värdet är 0 och returnera NULL i stället. Om det behövs anger du <config> till "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 dela ett INTERVALL eller ett numeriskt värde 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.

Förmildrande omständighet

Åtgärdandet av felet beror på orsaken:

  • Är uttrycket som orsakar felet korrekt?

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

  • Är uppgifterna korrekta?

    Om indata ska kunna resultera i att 0 värden 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 felaktiga raderna undantas, att 0-värdena konverteras till NULL med hjälp av nullif(expr, 0)eller att konvertera data till ett annat acceptabelt värde med hjälp av 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 returnerar NULL i stället för ett fel. Om du vill kan du nvl(try_divide(expr1, expr2), alt) för att omvandla den resulterande NULL till alternativa värden som 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 ange den angivna ansiconfig till false. Observera att den här inställningen är betydelsefull bortom 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