ANSI_MODE

Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş 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 hakkında bilgi için bkz Databricks Runtime'da ANSI uyumluluğu.

Ayarlar

  • DOĞRU

    SQL standardı, çoğu veritabanı ve veri ambarında olduğu gibi, belirli aritmetik işlemler ve tür dönüştürmelerini ele alış biçiminde SQL standardına uygundur. Bu standardın takip etmek daha iyi veri kalitesi, bütünlüğü ve taşınabilirliği teşvik eder.

  • YANLIŞ

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

deyimini kullanarak oturum düzeyinde ve SQL yapılandırma parametrelerini veya SQL Ambarı API'sinikullanarak bu parametreyi genel düzeyde ayarlayabilirsiniz.

Sistem varsayılanı

19 Ekim 2022 tarihinde veya sonrasında oluşturulan hesaplar için sistem varsayılanı şeklindedir TRUE.

Ayrıntılı açıklama

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

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

İşlemciler

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.

Operatör Açıklama Örnek ANSI_MODE = doğru ANSI_MODE = yanlış
kar payı / bölen Böleni bölene bölerek temettüyü döndürür. 1/0 Hata NULL
- expr İfadenin olumsuz 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ünenin bölen ile bölünmesinden sonra kalanı döndürür. 1 % 0 Hata NULL
çarpan * çarpılan Çarpanı çarpan ile çarpar ve sonucu döndürür. 100y * 100y Hata 16y (Taşma)
arrayExpr[dizin] arrayExpr ifadesindeki belirli bir dizinindeki öğeyi döndürür. Geçersiz dizi dizini Hata NULL
mapExpr[anahtar] anahtar için mapExpr değerini döndürür. Geçersiz harita anahtarı Hata NULL
bölen bölüm temettü Bölünenin bölen ile bölünmesi sonucunun tam sayı kısmı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.

Operatör Açıklama Koşul ANSI_MODE = doğru ANSI_MODE = yanlış
ABS (İfade) İ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 harita anahtarı Hata NULL
element_at(arrayExpr, dizin) arrayExpr ifadesindeki belirli bir dizinindeki öğeyi döndürür. Geçersiz dizi dizini Hata NULL
elt(index, expr1 [, ...] ) n'inci ifadeyi döndürür. Geçersiz dizin Hata NULL
make_date(y,e,d,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ünenin bölen ile bölünmesinden sonra kalanı döndürür. mod(1, 0) Hata NULL
next_day(ifade, haftanın günü) expr değerinden sonraki ve dayOfWeek olarak adlandırılan ilk tarihi döndürür. Haftanın günü geçersiz Hata NULL
parse_url(url, partToExtract[, anahtar]) 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
Boyut (İfade) İfadenin kardinalitesini döndürür. size(NULL) NULL -1
to_date(ifade[,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(ifade[,fmt]) İsteğe bağlı bir biçimlendirme kullanarak bir ifadeyi bir zaman damgasına dönüştürür. Geçersiz ifade veya biçim dizesi Hata NULL
to_unix_timestamp(ifade[,fmt]) İfade içindeki zaman damgasını UNIX zaman damgası olarak döndürür. Geçersiz ifade veya biçim dizesi Hata NULL
unix_timestamp([ifade[, 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ı

Kaynak türü Hedef türü Örnek ANSI_MODE = doğru ANSI_MODE = yanlış
Boolean (Boole Mantığı) Zaman Damgası cast(TRUE AS TIMESTAMP) Hata 1970-01-01 00:00:00.000001 UTC
Tarih Boolean (Boole Mantığı) cast(DATE'2001-08-09' AS BOOLEAN) Hata NULL
Zaman Damgası Boolean (Boole Mantığı) cast(TIMESTAMP'1970-01-01 00:00:00Z' AS BOOLEAN) Hata FALSE
Tam sayısal İkilik cast(15 AS BINARY) Hata ikili temsil

Çalışma zamanı hataları

Kaynak türü Hedef türü Koşul Örnek ANSI_MODE = doğru ANSI_MODE = yanlış
Dize Dize olmayan Geçersiz giriş cast('a' AS INTEGER) Hata NULL
Dizi, Yapı, Harita Dizi, Yapı, Harita 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 Tam sayısal Kısaltma cast(5.1 AS INTEGER) Hata 5

Uyarı

Bu dönüşümlerden her biri için, bir hata yerine try_cast kullanarak döndürebilirsiniz, NULL yerine.

Ö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ünü kullanırken, dize örtük olarak DOUBLE tipine dönüştürülür.
  • Herhangi bir sayısal türle bir STRING karşılaştırılırken, dize örtük olarak karşılaştırıldığı türe dönüştürülür.
  • UNION, COALESCEveya en az ortak türün bulunması gereken diğer işlemler gerçekleştirilirken, eğer herhangi bir STRING türü varsa, tüm türler STRING'ye dönüştürülür.

Databricks, yerine açıkça cast veya ANSI_MODE = FALSE işlevlerinin 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