DIVIDE_BY_ZERO hata sınıfı

SQLSTATE: 22012

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

Parametre

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

Açıklama

Azure Databricks bir INTERVAL veya sayısal değerini ile 0bölmeye çalıştığında bu hatayı tetikler. Bu hatayla birlikte sağlanan bağlam bilgileri, hatayı oluşturan nesneyi ve ifadeyi yalıtıyor. Bu hataya neden olabilecek mod gibi 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 hafifletilmesi nedene bağlıdır:

  • İfade hataya neden oluyor mu?

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

  • Veriler doğru mu?

    Giriş verilerinin geçirilen değerlere neden 0 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ı dışlamak, değerleri NULLnullif(expr,0 0) kullanarak dönüştürmek veya if(expr = 0, alt, expr) kullanarak verileri kabul edilebilir başka bir değere dönüştürmek anlamına gelebilir.

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

Son çare olarak, ifade veya veri akışı değiştirilemediğinde, sağlanan ansiconfigfalseayarını olarak ayarlayarak bu ANSI davranışını devre dışı bırakabilirsiniz. Bu ayarın , anlık hata koşulunun ötesinde bir sonuç 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