SQL-adattípus-szabályok
A következőre vonatkozik: Databricks SQL Databricks Runtime
Az Azure Databricks számos szabályt használ az adattípusok közötti ütközések feloldásához:
- Az előléptetés biztonságosan kibővít egy típust egy szélesebb típusra.
- Az implicit lecasting leszűkíti a típust. Az előléptetés ellentéte.
- Az implicit keresztcasting egy típust egy másik típusú család típusává alakít át.
Számos típus között explicit módon is átadhatja a öntött elemeket:
- A cast függvény a legtöbb típust átveszi, és hibákat ad vissza, ha nem.
- try_cast függvény úgy működik, mint a cast függvény , de null értéket ad vissza, ha érvénytelen értékeket ad át.
- Egyéb beépített függvények , amelyek a megadott formátumirányelvek használatával öntöttek a típusok között.
Típus-előléptetés
A típus-előléptetés az a folyamat, amely során egy típust egy másik, azonos típusú családba helyeznek, amely az eredeti típus összes lehetséges értékét tartalmazza.
Ezért a típus-előléptetés biztonságos művelet. Például TINYINT
a tartománya a és -128
a 127
között van. Az összes lehetséges érték biztonságosan előléptethető a értékre INTEGER
.
Írja be az elsőbbségi listát
A típus elsőbbségi listája határozza meg, hogy egy adott adattípus értékei implicit módon előléptethetők-e egy másik adattípusra.
Adattípus | Elsőbbségi lista (a legszűkebbtől a legszélesebbig) |
---|---|
TINYINT | TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMÁLIS ->LEBEGŐPONTOS (1) -> DUPLA |
SMALLINT | SMALLINT -> INT -> BIGINT -> DECIMÁLIS ->LEBEGŐPONTOS (1) -> DUPLA |
INT | INT –> BIGINT –> DECIMÁLIS –> LEBEGŐPONTOS (1) –> DUPLA |
BIGINT | BIGINT –> DECIMÁLIS –> LEBEGŐPONTOS (1) –> DUPLA |
DECIMÁLIS | DECIMÁLIS –> LEBEGŐPONTOS (1) –> DUPLA |
ÚSZÓ | FLOAT (1) -> DUPLA |
DUPLA | DOUBLE |
DÁTUM | DÁTUM –> IDŐBÉLYEG |
IDŐBÉLYEG | TIMESTAMP |
TÖMB | TÖMB (2) |
BINÁRIS | BINARY |
LOGIKAI | BOOLEAN |
INTERVALLUM | INTERVALLUM |
MEGJELENÍTÉSE | TÉRKÉP (2) |
KARAKTERLÁNC | STRING |
STRUCT | SZERKEZET (2) |
(1) A minimálisan gyakori típusfeloldás esetén a FLOAT ki van hagyva a pontosság elvesztésének elkerülése érdekében.
(2) Összetett típus esetén a prioritási szabály rekurzívan vonatkozik az összetevő elemeire.
Sztringek és NULL
A speciális szabályok vonatkoznak a és a nem begépelt karakterekre STRING
NULL
:
NULL
bármely más típusra előléptethető.STRING
előléptethető aBIGINT
,BINARY
, ,DATE
BOOLEAN
,DOUBLE
,INTERVAL
ésTIMESTAMP
. Ha a tényleges sztringérték nem alakítható át a legkevésbé gyakori típusra , az Azure Databricks futásidejű hibát okoz. A sztringérték előléptetésénekINTERVAL
meg kell egyeznie az intervallumegységekkel.
Írja be az elsőbbségi gráfot
Ez a prioritási hierarchia grafikus ábrázolása, amely a típus precedencialistáját , sztringeket és NULL-szabályokat kombinálja.
Legkevésbé gyakori típusfeloldás
A típuskészletek legkevésbé gyakori típusa a típus elsőbbségi gráfjából elérhető legszűkebb típus a típuskészlet összes eleme számára.
A legkevésbé gyakori típusfeloldás a következő célokra használható:
- Döntse el, hogy egy adott típusú paraméterre számító függvény meghívható-e egy szűkebb típusú argumentum használatával.
- Olyan függvény argumentumtípusának származtatása, amely megosztott argumentumtípust vár több paraméterhez, például a következőhöz: coalesce, in, least vagy greatest.
- Adja meg az operátorok operandusainak típusait, például az aritmetikai műveleteket vagy összehasonlításokat.
- Származtassa a kifejezés eredménytípusát, például az esetkifejezést.
- A tömb- és térképkonstruktorok elem-, kulcs- vagy értéktípusainak származtatása.
- Az UNION, INTERSECT vagy EXCEPT halmaz operátor eredménytípusának származtatása.
A rendszer speciális szabályokat alkalmaz, ha a legkevésbé gyakori típus a következőre FLOAT
oldható fel: . Ha a hozzájárulási típusok bármelyike pontos numerikus típus (TINYINT
, , SMALLINT
, INTEGER
BIGINT
vagy DECIMAL
) , akkor a rendszer a legkisebb közös típust küldi DOUBLE
el a számjegyek esetleges elvesztésének elkerülése érdekében.
Implicit lecasting és keresztcasting
Az Azure Databricks az implicit casting ezen formáit csak a függvények és operátorok meghívására alkalmazza, és csak akkor, ha egyértelműen meg tudja határozni a szándékot.
Implicit lecasting
Az implicit lecasting automatikusan egy szélesebb típust egy szűkebb típusra vetít anélkül, hogy explicit módon kellene megadnia a leadást. A lecasting kényelmes, de a váratlan futásidejű hibák kockázatát hordozza, ha a tényleges érték nem felel meg a szűk típusnak.
A downcasting a típus elsőbbségi listáját fordított sorrendben alkalmazza.
Implicit keresztcasting
Az implicit keresztcasting az egyik típuscsaládból a másikba vet egy értéket anélkül, hogy explicit módon kellene megadnia a leadást.
Az Azure Databricks támogatja az implicit keresztcastingot a következőről:
- Bármilyen egyszerű típus, kivéve
BINARY
a , hogySTRING
. - A
STRING
bármilyen egyszerű típusra.
- Bármilyen egyszerű típus, kivéve
Függvényhívások kiosztása
Egy feloldott függvény vagy operátor esetében a következő szabályok vonatkoznak a felsorolt sorrendben az egyes paraméter- és argumentumpárokra:
Ha egy támogatott paramétertípus az argumentum típus-elsőbbségi gráfjának része, az Azure Databricks előlépteti az argumentumot erre a paramétertípusra.
A legtöbb esetben a függvény leírása explicit módon tartalmazza a támogatott típusokat vagy láncokat, például "bármilyen numerikus típust".
A sin(kifejezés) például a függvényen
DOUBLE
működik, de bármilyen numerikus függvényt elfogad.Ha a várt paramétertípus egy
STRING
, és az argumentum egy egyszerű típus, az Azure Databricks keresztküldi az argumentumot a sztring paramétertípusra.Például a substr(str, start, len) függvény
str
várhatóan egySTRING
lesz. Ehelyett megadhat egy numerikus vagy datetime típust.Ha az argumentum típusa egy
STRING
, és a várt paramétertípus egy egyszerű típus, az Azure Databricks a sztringargumentumot a legszélesebb támogatott paramétertípusra szórja át.A date_add(dátum, nap) például egy
DATE
és egy függvénytINTEGER
vár.Ha két
STRING
s-vel hívja meg a meghívástdate_add()
, az Azure Databricks az elsőtSTRING
az értékreDATE
, a másodikatSTRING
pedig egyreINTEGER
keresztre szórja.Ha a függvény numerikus típust ,-
INTEGER
ra vagyDATE
típusra vár, de az argumentum egy általánosabb típus, például egyDOUBLE
vagyTIMESTAMP
, az Azure Databricks implicit módon erre a paramétertípusra adja vissza az argumentumot.Egy date_add (dátum, nap) például egy és egy
DATE
függvénytINTEGER
vár.Ha egy és egy
TIMESTAMP
BIGINT
parancsot hív megdate_add()
, az Azure Databricks az időösszetevő és aBIGINT
érték eltávolításával lekérte aTIMESTAMP
DATE
értéket egy értékreINTEGER
.Ellenkező esetben az Azure Databricks hibát jelez.
Példák
A coalesce függvény minden argumentumtípust elfogad, feltéve, hogy egy legkevésbé gyakori típust használnak.
Az eredménytípus az argumentumok legkevésbé gyakori típusa.
-- The least common type of TINYINT and BIGINT is BIGINT
> SELECT typeof(coalesce(1Y, 1L, NULL));
BIGINT
-- INTEGER and DATE do not share a precedence chain or support crosscasting in either direction.
> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]
-- Both are ARRAYs and the elements have a least common type
> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)))
ARRAY<BIGINT>
-- The least common type of INT and FLOAT is DOUBLE
> SELECT typeof(coalesce(1, 1F))
DOUBLE
> SELECT typeof(coalesce(1L, 1F))
DOUBLE
> SELECT typeof(coalesce(1BD, 1F))
DOUBLE
-- The least common type between an INT and STRING is BIGINT
> SELECT typeof(coalesce(5, '6'));
BIGINT
-- The least common type is a BIGINT, but the value is not BIGINT.
> SELECT coalesce('6.1', 5);
Error: 6.1 is not a BIGINT
-- The least common type between a DECIMAL and a STRING is a DOUBLE
> SELECT typeof(coalesce(1BD, '6'));
DOUBLE
Az alsztringfüggvény típus argumentumokat STRING
vár a sztringhez, INTEGER
valamint az indítási és hosszparaméterekhez.
-- Promotion of TINYINT to INTEGER
> SELECT substring('hello', 1Y, 2);
he
-- No casting
> SELECT substring('hello', 1, 2);
he
-- Casting of a literal string
> SELECT substring('hello', '1', 2);
he
-- Downcasting of a BIGINT to an INT
> SELECT substring('hello', 1L, 2);
he
-- Crosscasting from STRING to INTEGER
> SELECT substring('hello', str, 2)
FROM VALUES(CAST('1' AS STRING)) AS T(str);
he
-- Crosscasting from INTEGER to STRING
> SELECT substring(12345, 2, 2);
23
|| (ÖSSZEFŰZ) lehetővé teszi a sztringre történő implicit keresztcastingot.
-- A numeric is cast to STRING
> SELECT 'This is a numeric: ' || 5.4E10;
This is a numeric: 5.4E10
-- A date is cast to STRING
> SELECT 'This is a date: ' || DATE'2021-11-30';
This is a date: 2021-11-30
date_add meghívható egy TIMESTAMP
vagy BIGINT
implicit lecasting miatt.
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
date_add s-vel STRING
hívható meg implicit keresztcasting miatt.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05