Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:
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.
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
STRINGtürünü kullanırken, dize örtük olarakDOUBLEtipine dönüştürülür. - Herhangi bir sayısal türle bir
STRINGkarşı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 birSTRINGtürü varsa, tüm türlerSTRING'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