ANSI_MODE

Şunlar için geçerlidir:check marked yes Databricks SQL

Yapılandırma ANSI_MODE parametresi, yerleşik işlevlerin ve atama işlemlerinin temel davranışlarını denetler.

Bu makalede Databricks SQL'de ANSI modu açıklanmaktadır. Databricks Runtime'da ANSI uyumluluğu için bkz . Databricks Runtime'da ANSI uyumluluğu.

Ayarlar

  • TRUE

    Sql standardını, çoğu veritabanı ve veri ambarı gibi belirli aritmetik işlemler ve tür dönüştürmeleri ile nasıl ele alır? Bu standardın takip etmek daha iyi veri kalitesi, bütünlüğü ve taşınabilirliği teşvik eder.

  • FALSE

    Databricks SQL, Hive uyumlu davranışı kullanır.

BU parametreyi, SET deyimini kullanarak oturum düzeyinde ve SQL yapılandırma parametrelerini veya SQL Ambarı API'sini kullanarak genel düzeyde ayarlayabilirsiniz.

Sistem varsayılanı

Sistem varsayılan değeri Databricks TRUE SQL 2022.35 ve üzeri sürümlerine eklenen hesaplar içindir.

Ayrıntılı açıklama

Databricks SQL başvuru belgeleri SQL standart davranışını açıklar.

Aşağıdaki bölümlerde ANSI_MODE TRUE (ANSI modu) ile FALSE (ANSI dışı mod) arasındaki farklar açıklanmaktadır.

İşleçler

ANSI olmayan modda, sayısal türlerde gerçekleştirilen aritmetik işlemler taşan değerler veya NULL döndürebilirken ANSI modunda bu tür işlemler hata döndürebilir.

Operator Açıklama Örnek ANSI_MODE = true ANSI_MODE = false
kar payı / bölen Bölen tarafından bölünen temettü döndürür. 1/0 Hata NULL
- expr İfadenin negatif değerini döndürür. -(-128y) Hata -128y (Taşma)
expr1 - expr2 İfade1'den expr2 çıkarma işlemini döndürür. -128y - 1y Hata 127y (Taşma)
expr1 + expr2 İfade1 ve ifade2 toplamını döndürür. 127y + 1y Hata -128y (Taşma)
kar payı % bölen Bölündükten / bölenden sonra kalanı döndürür. 1 % 0 Hata NULL
çarpan * multiplicand Çarpanı çarpım ve çarpım ile çarparak döndürür. 100y * 100y Hata 16y (Taşma)
arrayExpr[index] Dizindeki bir arrayExpr öğesini döndürür. Geçersiz dizi dizini Hata NULL
mapExpr[key] anahtar için mapExpr değerini döndürür. Geçersiz eşleme anahtarı Hata NULL
bölen div dividend Bölen bölücünün bölme işleminin ayrılmaz bölümünü döndürür. 1 div 0 Hata NULL

İşlevler

Bazı yerleşik işlevlerin davranışı, aşağıda belirtilen koşullar altında ANSI modundan ANSI olmayan moda göre farklı olabilir.

Operator Açıklama Koşul ANSI_MODE = true ANSI_MODE = false
abs(expr) İfadedeki sayısal değerin mutlak değerini döndürür. abs(-128y) Hata -128y (Taşma)
element_at(mapExpr, anahtar) anahtar için mapExpr değerini döndürür. Geçersiz eşleme anahtarı Hata NULL
element_at(arrayExpr, dizin) Dizindeki bir arrayExpr öğesini döndürür. Geçersiz dizi dizini Hata NULL
elt(index, expr1 [, ...] ) n. ifadeyi döndürür. Geçersiz dizin Hata NULL
make_date(y,m,d) Yıl, ay ve gün alanlarından bir tarih oluşturur. Geçersiz sonuç tarihi Hata NULL
make_timestamp(y,m,d,h,mi,s[,tz]) Alanlardan bir zaman damgası oluşturur. Geçersiz sonuç zaman damgası Hata NULL
make_interval(y,m,w,d,h,mi,s) Alanlardan bir aralık oluşturur. Geçersiz sonuç aralığı Hata NULL
mod(kar payı, bölen) Bölündükten / bölenden sonra kalanı döndürür. mod(1, 0) Hata NULL
next_day(expr,dayOfWeek) expr değerinden sonraki ve dayOfWeek içinde olarak adlandırılan ilk tarihi döndürür. Geçersiz haftanın günü Hata NULL
parse_url(url, partToExtract[, key]) Url'den bir parça ayıklar. Geçersiz URL Hata NULL
pmod(kar payı, bölen) Kar payı /bölenden sonra kalan pozitif değeri döndürür. pmod(1, 0) Hata NULL
size(expr) İfadenin kardinalitesini döndürür. size(NULL) NULL -1
to_date(expr[,fmt]) İsteğe bağlı biçimlendirme kullanarak bir tarihe ifade ataması döndürür. Geçersiz ifade veya biçim dizesi Hata NULL
to_timestamp(expr[,fmt]) İsteğe bağlı biçimlendirme kullanarak bir zaman damgasına ifade ataması döndürür. Geçersiz ifade veya biçim dizesi Hata NULL
to_unix_timestamp(expr[,fmt]) İfadedeki zaman damgasını UNIX zaman damgası olarak döndürür. Geçersiz ifade veya biçim dizesi Hata NULL
unix_timestamp([expr[, fmt]]) Geçerli veya belirtilen saatin UNIX zaman damgasını döndürür. Geçersiz ifade veya biçim dizesi Hata NULL

Atama kuralları

CAST ile ilgili kurallar ve davranışlar ANSI modunda daha katıdır. Bunlar aşağıdaki üç kategoriye ayrılabilir:

Derleme zamanı dönüştürme kuralları

Source type Hedef türü Örnek ANSI_MODE = true ANSI_MODE = false
Boolean Zaman damgası cast(TRUE AS TIMESTAMP) Hata 1970-01-01 00:00:00.000001 UTC
Tarih Boolean cast(DATE'2001-08-09' AS BOOLEAN) Hata NULL
Zaman damgası Boolean cast(TIMESTAMP'1970-01-01 00:00:00Z' AS BOOLEAN) Hata FALSE
İntegral sayısal İkilik cast(15 AS BINARY) Hata ikili gösterimi

Çalışma zamanı hataları

Source type Hedef türü Koşul Örnek ANSI_MODE = true ANSI_MODE = false
String Dize olmayan Geçersiz giriş cast('a' AS INTEGER) Hata NULL
Dizi, Yapı, Eşleme Dizi, Yapı, Eşleme Geçersiz giriş cast(ARRAY('1','2','3') AS ARRAY<DATE>) Hata NULL
Sayısal Sayısal Taşma cast(12345 AS BYTE) Hata NULL
Sayısal İntegral sayısal Kesilme cast(5.1 AS INTEGER) Hata 5

Not

Bu atamaların her biri için, bir hata yerine döndürmek NULL için atama yerine try_cast kullanabilirsiniz.

Örtük tür zorlama kuralları

altında ANSI_MODE = TRUEDatabricks SQL, aşağıdakiler için net SQL veri türü atama kurallarını kullanır:

Buna karşılık ANSI_MODE = FALSE tutarsız ve daha yumuşaktır. Örneğin:

  • Herhangi bir aritmetik işleç ile bir STRING tür kullanırken, dize örtük olarak öğesine DOUBLEyayınlanır.
  • bir STRING ile herhangi bir sayısal tür karşılaştırılırken, dize örtük olarak karşılaştırıldığında türüne türe yayınlanır.
  • En az ortak türün bulunması gereken bir UNION, COALESCEveya diğer işlemler gerçekleştirilirken, herhangi STRING bir tür varsa tüm türler türüne STRING yayınlanır.

Databricks, öğesine güvenmek ANSI_MODE = FALSEyerine açık atama veya try_cast işlevinin kullanılmasını önerir.

Örnekler

> SET ansi_mode = true;

-- Protects against integral numeric overflow
> SELECT cast(12345 AS TINYINT);
  Casting 12345 to tinyint causes overflow

-- For invalid values raises errors instead of returning NULL.
> SELECT cast('a' AS INTEGER);
  Invalid input syntax for type numeric: a.
  To return NULL instead, use 'try_cast'

-- try_cast() is consistent for both modes
> SELECT try_cast('a' AS INTEGER);
  NULL

-- Does not allow ambiguous crosscasting.
> SELECT c1 + c2 FROM VALUES('5', '7.6') AS T(c1, c2);
  Cannot resolve '(T.c1 + T.c2)' due to data type mismatch:
  '(T.c1 + T.c2)' requires (numeric or interval day to second or interval year to month or interval) type, not string

-- Promotes STRING to least common type (STRING, INTEGER --> BIGINT) for arithmetic operation.
> SELECT typeof(5 - '3');
  bigint

-- Promotes STRING to least common type (INTEGER, STRING --> BIGINT) with runtime check
> SELECT c1 = c2 FROM VALUES(10, '10.1') AS T(c1, c2);
  Invalid input syntax for type numeric: 10.1. To return NULL instead, use 'try_cast'.

-- Promotes STRING to least common type (STRING, INTEGER --> BIGINT) for set operation with runtime check.
> SELECT typeof(c1) FROM (SELECT 5 UNION ALL SELECT '6') AS T(c1);
  bigint
  bigint
> SET ansi_mode = false;

-- Silent integral numeric overflow
> SELECT cast(12345 AS TINYINT);
  57

-- Returns NULL instead of an error
> SELECT cast('a' AS INTEGER);
  NULL

-- try_cast() is safe for both modes
> SELECT try_cast('a' AS INTEGER);
  NULL

-- Does allow ambiguous crosscasting using DOUBLE.
> SELECT c1 + c2 FROM VALUES('5', '7.6') AS T(c1, c2);
  12.6

-- Crosscasts STRING to DOUBLE for arithmetic operation.
> SELECT typeof(5 - '3');
  double

-- Implicitly casts STRING to INTEGER equating 10 with 10.1
> SELECT c1 = c2 FROM VALUES(10, '10.1') AS T(c1, c2);
  true

-- Promotes to string for set operations
> SELECT typeof(c1) FROM (SELECT 5 UNION ALL SELECT '6') AS T(c1);
  string
  string