SQL-gegevenstyperegels
Van toepassing op: Databricks Databricks Runtime
Azure Databricks gebruikt verschillende regels om conflicten tussen gegevenstypen op te lossen:
- Promotie breidt een type veilig uit naar een breder type.
- Impliciete downcasting beperkt een type. Het tegenovergestelde van promotie.
- Impliciete crosscasting transformeert een type in een type van een andere typefamilie.
U kunt ook expliciet casten tussen verschillende typen:
- cast-functie casts tussen de meeste typen en retourneert fouten als dit niet mogelijk is.
- try_cast functie werkt als cast-functie , maar retourneert NULL wanneer ongeldige waarden worden doorgegeven.
- Andere ingebouwde functies worden tussen typen gecast met behulp van opgegeven indelingsrichtlijnen.
Typepromotie
Typepromotie is het proces van het casten van een type in een ander type van dezelfde typefamilie dat alle mogelijke waarden van het oorspronkelijke type bevat.
Daarom is typepromotie een veilige bewerking. Heeft bijvoorbeeld TINYINT
een bereik van -128
tot 127
. Alle mogelijke waarden kunnen veilig worden gepromoveerd naar INTEGER
.
Lijst met typen prioriteit
De lijst met prioriteitstypen bepaalt of waarden van een bepaald gegevenstype impliciet kunnen worden gepromoveerd naar een ander gegevenstype.
Gegevenstype | Prioriteitslijst (van smalste naar breedste) |
---|---|
TINYINT | TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAAL -> FLOAT (1) -> DUBBEL |
SMALLINT | SMALLINT -> INT -> BIGINT -> DECIMAAL -> ZWEVEND (1) -> DUBBEL |
INT | INT -> BIGINT -> DECIMAAL -> ZWEVEND (1) -> DUBBEL |
BIGINT | BIGINT -> DECIMAAL -> ZWEVEND (1) -> DUBBEL |
DECIMAAL | DECIMAAL -> ZWEVEND (1) -> DUBBEL |
FLOAT | FLOAT (1) -> DUBBEL |
DUBBELE | DUBBELE |
DATUM | DATUM -> TIJDSTEMPEL |
TIJDSTEMPEL | TIJDSTEMPEL |
ARRAY | MATRIX (2) |
BINAIRE | BINAIRE |
BOOLEAANSE | BOOLEAANSE |
INTERVAL | INTERVAL |
KAART | KAART (2) |
TEKENREEKS | TEKENREEKS |
STRUCT | STRUCT (2) |
(1) Voor de minst voorkomende typeresolutie wordt FLOAT overgeslagen om verlies van precisie te voorkomen.
(2) Voor een complex type wordt de prioriteitsregel recursief toegepast op de onderdelen ervan.
Tekenreeksen en NULL
Speciale regels zijn van toepassing op STRING
en niet getypt NULL
:
NULL
kan worden gepromoveerd naar elk ander type.STRING
kan worden gepromoveerd naarBIGINT
,BOOLEAN
BINARY
, ,DATE
,DOUBLE
,INTERVAL
enTIMESTAMP
. Als de werkelijke tekenreekswaarde niet kan worden omgezet naar het minst voorkomende type Azure Databricks, treedt er een runtimefout op. Bij het promoveren naarINTERVAL
de tekenreekswaarde moeten de intervallen overeenkomen met de intervallen.
Grafiek met typeprioriteit
Dit is een grafische weergave van de prioriteitshiƫrarchie, waarbij de lijst met prioriteitstypen en tekenreeksen en NULL-regels worden gecombineerd.
Minst gangbare typeresolutie
Het minst voorkomende type van een set typen is het smalste type dat vanuit de grafiek met prioriteitstypen kan worden bereikt door alle elementen van de set typen.
De minst gangbare typeresolutie wordt gebruikt om:
- Bepaal of een functie die een parameter van een bepaald type verwacht, kan worden aangeroepen met behulp van een argument van een smaller type.
- Het argumenttype afleiden voor een functie die een gedeeld argumenttype verwacht voor meerdere parameters, zoals coalesce, in, least of greatest.
- De operandtypen afleiden voor operatoren, zoals rekenkundige bewerkingen of vergelijkingen.
- Het resultaattype afleiden voor expressies, zoals de case-expressie.
- De element-, sleutel- of waardetypen voor matrix - en kaartconstructors afleiden.
- Leid het resultaattype af van de operatoren UNION, INTERSECT of EXCEPT .
Speciale regels worden toegepast als het minst voorkomende type wordt omgezet in FLOAT
. Als een van de bijdragende typen een exact numeriek type (TINYINT
, , SMALLINT
INTEGER
, BIGINT
, of DECIMAL
) is, wordt het minst voorkomende type naar DOUBLE
gepusht om mogelijk verlies van cijfers te voorkomen.
Impliciete downcasting en crosscasting
Azure Databricks gebruikt deze vormen van impliciete cast alleen op functie- en operator-aanroepen, en alleen waar de intentie ondubbelzinnig kan worden bepaald.
Impliciete downcasting
Impliciete downcasting cast automatisch een breder type naar een smaller type zonder dat u de cast expliciet hoeft op te geven. Downcasting is handig, maar brengt het risico op onverwachte runtimefouten met zich mee als de werkelijke waarde niet kan worden weergegeven in het smalle type.
Met downcasting wordt de prioriteitslijst van het type in omgekeerde volgorde toegepast.
Impliciete crosscasting
Impliciete crosscasting cast een waarde van de ene typefamilie naar de andere zonder dat u de cast expliciet hoeft op te geven.
Azure Databricks biedt ondersteuning voor impliciete crosscasting van:
- Elk eenvoudig type, met uitzondering van
BINARY
, totSTRING
. - Een
STRING
voor elk eenvoudig type.
- Elk eenvoudig type, met uitzondering van
Casten op functie-aanroep
Bij een opgeloste functie of operator zijn de volgende regels van toepassing, in de volgorde waarin ze worden vermeld, voor elk parameter- en argumentpaar:
Als een ondersteund parametertype deel uitmaakt van de grafiek met typeprioriteit van het argument, promoveert Azure Databricks het argument naar dat parametertype.
In de meeste gevallen vermeldt de beschrijving van de functie expliciet de ondersteunde typen of keten, zoals 'elk numeriek type'.
Sin(expr) werkt bijvoorbeeld op
DOUBLE
, maar accepteert alle numerieke waarden.Als het verwachte parametertype een
STRING
is en het argument een eenvoudig type is, wordt het argument door Azure Databricks naar het parametertype tekenreeks gecast .Substr(str, begin, lengte) verwacht
str
bijvoorbeeld eenSTRING
te zijn. In plaats daarvan kunt u een numeriek of datum/tijd-type doorgeven.Als het argumenttype een
STRING
is en het verwachte parametertype een eenvoudig type is, kruist Azure Databricks het tekenreeksargument naar het breedste ondersteunde parametertype.Date_add(datum, dagen) verwacht bijvoorbeeld een
DATE
en eenINTEGER
.Als u aanroept
date_add()
met tweeSTRING
s, kruist Azure Databricks de eersteSTRING
naarDATE
en de tweedeSTRING
naar eenINTEGER
.Als de functie een numeriek type verwacht, zoals een
INTEGER
, of eenDATE
type, maar het argument een meer algemeen type is, zoals eenDOUBLE
ofTIMESTAMP
, wordt het argument impliciet naar dat parametertype ge downcast door Azure Databricks.Een date_add(datum, dagen) verwacht bijvoorbeeld een
DATE
en eenINTEGER
.Als u aanroept
date_add()
met eenTIMESTAMP
en eenBIGINT
, downcastt Azure Databricks deTIMESTAMP
naarDATE
door het tijdonderdeel en deBIGINT
te verwijderen naar eenINTEGER
.Anders genereert Azure Databricks een fout.
Voorbeelden
De functie coalesce accepteert elke set argumenttypen, zolang ze maar een minst gemeenschappelijk type hebben.
Het resultaattype is het minst voorkomende type argumenten.
-- 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
De subtekenreeksfunctie verwacht argumenten van het type STRING
voor de tekenreeks en INTEGER
voor de begin- en lengteparameters.
-- 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
|| (TEKST.SAMENV) staat impliciete crosscasting naar tekenreeks toe.
-- 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 kan worden aangeroepen met een TIMESTAMP
of BIGINT
vanwege impliciete downcasting.
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
date_add kan worden aangeroepen met STRING
s vanwege impliciete crosscasting.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05