ANSI_MODE
A következőkre vonatkozik: Databricks SQL
A ANSI_MODE
konfigurációs paraméter szabályozza a beépített függvények és az öntvényműveletek fő viselkedését.
Ez a cikk a Databricks SQL ANSI-módját ismerteti. A Databricks Runtime ANSI-megfelelőségével kapcsolatban lásd a Databricks Runtime ANSI-megfelelőségét.
Beállítások
IGAZ
A legtöbb adatbázishoz és adattárházhoz hasonlóan az SQL-szabványt követi, hogyan kezeli bizonyos aritmetikai műveleteket és típuskonverziókat. Ennek a szabványnak a betartása jobb adatminőséget, integritást és hordozhatóságot biztosít.
TÉVES
A Databricks SQL Hive-kompatibilis viselkedést használ.
Ezt a paramétert a munkamenet szintjén a SET utasítással, globális szinten pedig SQL-konfigurációs paraméterekkel vagy az SQL Warehouse API-val állíthatja be.
A rendszer alapértelmezése
A rendszer alapértelmezett értéke a TRUE
Databricks SQL 2022.35-ös vagy újabb verzióban hozzáadott fiókokhoz tartozik.
Részletes leírás
A Databricks SQL referenciadokumentációja az SQL standard viselkedését ismerteti.
A következő szakaszok a ANSI_MODE TRUE
(ANSI mód) és FALSE
a (nem ANSI-mód) közötti különbségeket ismertetik.
Operátorok
Nem ANSI módban a numerikus típusokon végrehajtott számtani műveletek túlcsordult értékeket vagy NULL értéket adhatnak vissza, míg ANSI módban az ilyen műveletek hibát adnak vissza.
Operátor | Leírás | Példa | ANSI_MODE = igaz | ANSI_MODE = hamis |
---|---|---|---|---|
osztalék/ osztó | Osztóval osztva az osztalékot adja eredményül. | 1/0 |
Hiba | NULL |
- kifésül | Az expr negatív értékét adja eredményül. | -(-128y) |
Hiba | -128y (Túlcsordulás) |
expr1 - expr2 | Az expr2 kivonását adja vissza az expr1-ből. | -128y - 1y |
Hiba | 127y (Túlcsordulás) |
expr1 + expr2 | Az expr1 és a kitevő2 összegét adja vissza. | 127y + 1y |
Hiba | -128y (Túlcsordulás) |
osztalék %-os osztója | Az osztalék/ osztó után fennmaradó részt adja eredményül. | 1 % 0 |
Hiba | NULL |
szorzó * szorzás | Szorzó szorzását adja eredményül. | 100y * 100y |
Hiba | 16y (Túlcsordulás) |
arrayExpr[index] | Egy tömbExpr elemét adja vissza az indexben. | Érvénytelen tömbindex | Hiba | NULL |
mapExpr[key] | A mapExpr kulcs értékét adja vissza. | Érvénytelen térképkulcs | Hiba | NULL |
osztó div osztalék | Az osztó osztalékkal való megosztásának szerves részét adja vissza. | 1 div 0 |
Hiba | NULL |
Függvények
Egyes beépített függvények viselkedése eltérő lehet ANSI módban és nem ANSI módban az alábbi feltételek mellett.
Operátor | Leírás | Feltétel | ANSI_MODE = igaz | ANSI_MODE = hamis |
---|---|---|---|---|
abs(expr) | Az expr numerikus értékének abszolút értékét adja vissza. | abs(-128y) |
Hiba | -128y (Túlcsordulás) |
element_at(mapExpr, kulcs) | A mapExpr kulcs értékét adja vissza. | Érvénytelen térképkulcs | Hiba | NULL |
element_at(arrayExpr, index) | Egy tömbExpr elemét adja vissza az indexben. | Érvénytelen tömbindex | Hiba | NULL |
elt(index, expr1 [, ...] ) | Az n. kifejezést adja vissza. | Érvénytelen index | Hiba | NULL |
make_date(y;m;d) | Dátumot hoz létre az év, a hónap és a nap mezőiből. | Érvénytelen eredménydátum | Hiba | NULL |
make_timestamp(y,m,d,h,mi;s[,tz]) | Időbélyeget hoz létre a mezőkből. | Érvénytelen eredményidőbélyegző | Hiba | NULL |
make_interval(y,m,w,d,h;mi;s) | Intervallumot hoz létre a mezőkből. | Érvénytelen eredményintervallum | Hiba | NULL |
mod(osztalék, osztó) | Az osztalék/ osztó után fennmaradó részt adja eredményül. | mod(1, 0) |
Hiba | NULL |
next_day(expr;dayOfWeek) | Az első dátumot adja vissza, amely későbbi, mint az expr, és a dayOfWeek névvel van elnevezve. | Érvénytelen a hét napja | Hiba | NULL |
parse_url(url, partToExtract[, key]) | Kinyer egy részt az URL-címből. | Érvénytelen URL-cím | Hiba | NULL |
pmod(osztalék, osztó) | Az osztalék/ osztó után a pozitív maradékot adja eredményül. | pmod(1, 0) |
Hiba | NULL |
size(expr) | Az expr számosságát adja vissza. | size(NULL) |
NULL |
-1 |
to_date(expr[;fmt]) | Az expr cast értéket adja vissza egy dátumra opcionális formázással. | Érvénytelen kifejezés vagy formázási sztring | Hiba | NULL |
to_timestamp(expr[;fmt]) | A kitevőt egy időbélyegre adja vissza opcionális formázással. | Érvénytelen kifejezés vagy formázási sztring | Hiba | NULL |
to_unix_timestamp(expr[;fmt]) | UnIX-időbélyegként adja vissza az időbélyeget a kitérőben. | Érvénytelen kifejezés vagy formázási sztring | Hiba | NULL |
unix_timestamp([expr[, fmt]]) | Az aktuális vagy megadott idő UNIX időbélyegét adja vissza. | Érvénytelen kifejezés vagy formázási sztring | Hiba | NULL |
Kiosztási szabályok
A CAST-hez kapcsolódó szabályok és viselkedések ANSI módban szigorúbbak. Ezek három kategóriába sorolhatók:
Fordítási idő konverziós szabályai
Forrás típusa | Céltípus | Példa | ANSI_MODE = igaz | ANSI_MODE = hamis |
---|---|---|---|---|
Logikai | Időbélyegző | cast(TRUE AS TIMESTAMP) |
Hiba | 1970-01-01 00:00:00.000001 UTC |
Dátum | Logikai | cast(DATE'2001-08-09' AS BOOLEAN) |
Hiba | NULL |
Időbélyegző | Logikai | cast(TIMESTAMP'1970-01-01 00:00:00Z' AS BOOLEAN) |
Hiba | FALSE |
Integrál numerikus | Bináris | cast(15 AS BINARY) |
Hiba | bináris ábrázolás |
Futtatókörnyezeti hibák
Forrás típusa | Céltípus | Feltétel | Példa | ANSI_MODE = igaz | ANSI_MODE = hamis |
---|---|---|---|---|---|
Sztring | Nem sztring | Érvénytelen bemenet | cast('a' AS INTEGER) |
Hiba | NULL |
Tömb, Struct, Térkép | Tömb, Struct, Térkép | Érvénytelen bemenet | cast(ARRAY('1','2','3') AS ARRAY<DATE>) |
Hiba | NULL |
Numerikus | Numerikus | Túlcsordulás | cast(12345 AS BYTE) |
Hiba | NULL |
Numerikus | Integrál numerikus | Csonkolás | cast(5.1 AS INTEGER) |
Hiba | 5 |
Feljegyzés
Mindegyik szereposztáshoz használhatja a try_cast ahelyett , hogy hiba helyett visszatérést NULL
eredményez.
Implicit típusú kényszerítő szabályok
A Databricks SQL a ANSI_MODE = TRUE
következő célokra használ egyértelmű SQL-adattípus-öntési szabályokat :
Ezzel szemben ANSI_MODE = FALSE
inkonzisztens és engedékenyebb. Példa:
- Ha bármilyen aritmetikai operátorral rendelkező típust
STRING
használ, a sztring implicit módon a következőreDOUBLE
lesz öntött. - Ha bármilyen numerikus típussal összehasonlít egy sztringet
STRING
, a sztring implicit módon ahhoz a típushoz lesz öntött, amelyet összehasonlít. - Olyan ,
COALESCE
vagy egyéb műveletek végrehajtásakorUNION
, amelyeknél a legkevésbé gyakori típust kell megtalálni, az összes típust át kell adniSTRING
, ha van ilyenSTRING
típus.
A Databricks az explicit cast vagy try_cast függvény használatát javasolja ahelyett, hogy a függvényre támaszkodik ANSI_MODE = FALSE
.
Példák
> 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
Kapcsolódó
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: