0으로 나누기.
try_divide를 사용하여 나누기 수가 0일 때 이를 처리하고 대신 NULL을 반환합니다.
필요한 경우 이 오류를 무시하려면 <config> "false"로 설정합니다.
매개 변수
- ansiConfig: 동작을 변경할 구성의 이름입니다.
설명
Azure Databricks가 INTERVAL 또는 숫자를 0로 나누려고 시도할 때마다 이 오류가 발생합니다.
이 오류와 함께 제공되는 컨텍스트 정보는 오류가 발생한 개체와 식을 격리합니다.
이 오류를 일으킬 수 있는 mod같은 함수 및 연산자는 더 복잡한 수식의 일부로 나누기 수행 중인 함수를 포함합니다.
완화
오류 완화는 원인에 따라 달라집니다.
오류를 일으키는 표현이 올바른가요?
식이 올바르지 않으면
0값이 발생하지 않도록 수정하고 쿼리를 다시 시도합니다.데이터가 올바른가요?
입력 데이터가
0값이 전달될 수 있어야 하는 경우 데이터를 인수로 함수에 전달하기 전에 원본에서 데이터를 수정하거나 정리해야 할 수 있습니다.데이터 정리는 잘못된 행을 제외하거나,
0사용하여NULL값을 변환하거나, if(expr = 0, alt, expr)사용하여 데이터를 다른 허용 가능한 값으로 변환하는 것을 의미할 수 있습니다.
식과 데이터가 올바르고 나누기를 0으로 허용하려는 경우 try_divide사용할 수 있습니다.
대안으로, 인수를 nullif(expr, 0)로 변경합니다.
이렇게 하면 식에서 오류 대신 NULL을 반환합니다.
원하는 경우 nvl(try_divide(expr1, expr2), alt)를 사용하여, 결과 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