ANSI_MODE
Ş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 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 = TRUE
Databricks 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 öğesineDOUBLE
yayı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
,COALESCE
veya diğer işlemler gerçekleştirilirken, herhangiSTRING
bir tür varsa tüm türler türüneSTRING
yayınlanır.
Databricks, öğesine güvenmek ANSI_MODE = FALSE
yerine 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