DIVIDE_BY_ZERO, klasa błędów

SQLSTATE: 22012

Dzielenie przez zero. Służy try_divide do tolerowania dzielnika 0 i zwracania wartości NULL zamiast. W razie potrzeby ustaw <config> wartość "false", aby pominąć ten błąd.

Parametry

  • ansiConfig: nazwa konfiguracji, aby zmienić zachowanie.

Wyjaśnienie

Usługa Azure Databricks zgłasza ten błąd za każdym razem, gdy próbuje podzielić interwał lub wartość liczbową według 0. Informacje kontekstowe dostarczone z tym błędem izoluje obiekt i wyrażenie, w którym wystąpił błąd. Funkcje i operatory, takie jak mod, które mogą powodować ten błąd, obejmują te, które wykonują dzielenie w ramach bardziej złożonych formuł.

Łagodzenia

Ograniczenie ryzyka błędu zależy od przyczyny:

  • Czy wyrażenie powoduje poprawność błędu?

    Jeśli wyrażenie jest niepoprawne, należy go naprawić, aby 0 wartość nie mogła wystąpić, i ponów próbę zapytania.

  • Czy dane są poprawne?

    Jeśli dane wejściowe powinny być w stanie spowodować 0 przekazanie wartości, może być konieczne naprawienie danych w źródle lub wyczyszczenie ich przed przekazaniem danych do funkcji jako argumentu.

    Czyszczenie danych może oznaczać wykluczenie obraźliwych wierszy w celu przekonwertowania 0 wartości na NULL wartość nullif(wyrażenie, 0)lub przekonwertowanie danych na inną akceptowalną wartość przy użyciu funkcji if(expr = 0, alt, expr).

Jeśli wyrażenie i dane są poprawne i chcesz tolerować dzielenie przez zero, możesz użyć try_divide. Alternatywnie zmień argument na nullif(expr, 0). Spowoduje to zwrócenie NULL wyrażenia zamiast błędu. Jeśli wolisz, możesz przekształcić wynikowe wartości w nvl(try_divide(expr1, expr2), alt), aby przekształcić wynikowe NULL w wartości alternatywne, takie jak elementy neutralne na potrzeby dodawania 0 lub mnożenia 1.

W ostateczności, gdy nie można zmienić wyrażenia lub przepływu danych, możesz wyłączyć to zachowanie ANSI, ustawiając wartość .ansiconfigfalse Należy pamiętać, że to ustawienie jest konsekwencją wykraczającą poza bezpośredni warunek błędu.

Przykłady

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