次の方法で共有


DIVIDE_BY_ZEROエラー状態

SQLSTATE: 22012

0 で除算します。 除数が 0 であることを許容し、代わりに NULL を返すには、 try_divide を使用します。 このエラーをバイパスするには、必要に応じて <config> を "false" に設定します。

パラメーター

  • ansiConfig: 動作を変更する構成の名前。

Explanation

Azure Databricks では、INTERVAL または数値を 0で除算しようとするたびに、このエラーが発生します。 このエラーで提供されるコンテキスト情報は、エラーが発生したオブジェクトと式を分離します。 このエラーを引き起こす可能性のある関数や演算子には、mod など、より複雑な数式の一部として除算を実行するものが含まれます。

緩和策

エラーの軽減策は、原因によって異なります。

  • 式がエラーの原因になっているのは正しいですか?

    式が正しくない場合は、 0 値が発生しないように修正し、クエリを再試行してください。

  • データは正しいですか?

    入力データが結果として 0 値を渡すことができる場合は、ソースのデータを修正するか、データを引数として関数に渡す前に消去する必要があります。

    データクリーニングは、問題のある行を除外し、0を使用してNULL値をに変換するか、if(expr = 0, alt, expr)を使用してデータを別の許容値に変換することを意味します。

式とデータが正しく、ゼロ除算を許容する場合は、 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