DIVIDE_BY_ZERO hata koşulu

SQLSTATE: 22012

Sıfıra bölme. Bölenin 0 olmasına izin vermek ve bunun yerine NULL döndürmek için try_divide kullanın. Gerekirse bu hatayı atlamak için <config> "false" olarak ayarlayın.

Parametreler

  • ansiConfig: Davranışı değiştirmek için yapılandırmanın adı.

Açıklama

Azure Databricks, bir zaman aralığını veya sayısal değeri 0ile bölmeye çalıştığında bu hatayı oluşturur. Bu hatayla birlikte sağlanan bağlam bilgileri, nesneyi ve hatanın oluştuğu ifadeyi yalıtıyor. bu hataya neden olabilecek modgibi işlevler ve işleçler, daha karmaşık formüllerin bir parçası olarak bölme gerçekleştirenleri içerir.

Azaltma

Hatanın azaltılması nedene bağlıdır:

  • hataya neden olan ifade doğru mu?

    İfade yanlışsa, 0 değerinin oluşamaması için düzeltin ve sorguyu yeniden deneyin.

  • Veriler doğru mu?

    Giriş verilerinin 0 değerlerinin geçirilmesine neden olması gerekiyorsa, verileri işleve bağımsız değişken olarak geçirmeden önce kaynaktaki verileri düzeltmeniz veya temizlemeniz gerekebilir.

    Veri temizleme, sorunlu satırları hariç tutmak, 0 değerlerini NULLkullanarak 'e dönüştürmek veya if(expr = 0, alt, expr)kullanarak verileri başka bir kabul edilebilir değere dönüştürmek anlamına gelebilir.

İfade ve veriler doğruysa ve bölmeyi sıfıra kadar tolere etmek istiyorsanız, try_dividekullanabilirsiniz. Alternatif olarak, bağımsız değişkeni nullif(expr, 0) olarak değiştirin. Bu, ifadenin hata yerine NULL döndürmesine neden olur. Tercih ederseniz, nvl(try_divide(expr1, expr2), alt) kullanarak elde edilen sonucu, toplama veya çarpma için nötr öğeler gibi alternatif değerlere dönüştürebilirsiniz.NULL01

Son çare olarak, ifade veya veri akışı değiştirilemediğinde, sağlanan ansiconfigfalseolarak ayarlayarak bu ANSI davranışını devre dışı bırakabilirsiniz. Bu ayarın anlık hata koşulunun ötesinde etkileri olduğunu unutmayın.

Örnekler

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