다음을 통해 공유


DIVIDE_BY_ZERO 오류 클래스

SQLSTATE: 22012

0으로 나누기. 를 사용하여 try_divide 수수가 0이 되는 것을 허용하고 대신 NULL을 반환합니다. 필요한 경우 이 오류를 무시하려면 "false"로 설정합니다 <config> .

매개 변수

  • ansiConfig: 동작을 변경하는 구성의 이름입니다.

설명

Azure Databricks는 INTERVAL 또는 숫자를 0로 나누려고 할 때마다 이 오류를 발생합니다. 이 오류와 함께 제공되는 컨텍스트 정보는 개체와 오류가 발생한 식을 격리합니다. 이 오류를 일으킬 수 있는 모드와 같은 함수 및 연산자에는 더 복잡한 수식의 일부로 나누기 수행 중인 함수가 포함됩니다.

완화 방법

오류 완화는 원인에 따라 달라집니다.

  • 식이 오류를 발생시키는 것이 올바른가요?

    식이 올바르지 않으면 값이 0 발생하지 않도록 수정하고 쿼리를 다시 시도합니다.

  • 데이터가 올바른가요?

    입력 데이터로 인해 0 값이 전달될 수 있는 경우 데이터를 인수로 함수에 전달하기 전에 원본에서 데이터를 수정하거나 클린 해야 할 수 있습니다.

    데이터 정리는 잘못된 행을 제외하거나, 값을 NULLnullif(expr, 0)를 사용하여 변환 0 하거나 if(expr = 0, alt, expr)를 사용하여 데이터를 다른 허용 가능한 값으로 변환하는 것을 의미할 수 있습니다.

식과 데이터가 올바르고 나누기를 0으로 허용하려는 경우 try_divide 사용할 수 있습니다. 또는 인수를 nullif(expr, 0)로 변경합니다. 이렇게 하면 식이 오류 대신 반환 NULL 됩니다. 원하는 경우 nvl(try_divide(expr1, expr2), alt) 을 ue하여 결과를 NULL 추가 0 또는 곱 1하기 위한 중립 요소와 같은 대체 값으로 바꿀 수 있습니다.

최후의 수단으로 식 또는 데이터 흐름을 변경할 수 없는 경우 제공된 ansiconfigfalse을 로 설정하여 이 ANSI 동작을 사용하지 않도록 설정할 수 있습니다. 이 설정은 즉각적인 오류 조건을 벗어나는 결과입니다.

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