Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:
Databricks SQL
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 veel typen:
- cast-functie zet om tussen de meeste typen en retourneert fouten als het niet mogelijk is.
- try_cast functie werkt als cast-functie, maar retourneert NULL wanneer ongeldige waarden worden doorgegeven.
- Andere ingebouwde functies zetten typen om met behulp van opgegeven formaatinstructies.
Typepromotie
Typepromotie is het proces van het omzetten van een type in een ander type van dezelfde typefamilie die alle mogelijke waarden van het oorspronkelijke type bevat.
Daarom is typepromotie een veilige werking. Heeft bijvoorbeeld TINYINT een bereik van -128 tot 127. Alle mogelijke waarden kunnen veilig worden omgezet in INTEGER.
Lijst met typeprioriteit
De lijst met typeprioriteit bepaalt of waarden van een bepaald gegevenstype impliciet kunnen worden gepromoveerd naar een ander gegevenstype.
| Gegevenstype | Prioriteitslijst (van smal naar breedst) |
|---|---|
| TINYINT | TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAAL -> FLOAT (1) -> DUBBEL |
| SMALLINT | SMALLINT -> INT -> BIGINT -> DECIMAAL -> FLOAT (1) -> DUBBEL |
| INT | INT -> BIGINT -> DECIMAAL -> FLOAT (1) -> DUBBEL |
| BIGINT | BIGINT - DECIMAAL ->> FLOAT (1) -> DUBBEL |
| DECIMAAL | DECIMAAL -> FLOAT (1) -> DUBBEL |
| DRIJVEN | FLOAT (1) -> DUBBEL |
| DUBBEL | Dubbel |
| DATUM | DATUM -> TIJDSTEMPEL |
| TIJDSTEMPEL | TIJDSTEMPEL |
| ARRAY | MATRIX (2) |
| BINAIR | BINAIR |
| BOOLEAANS | Booleaans |
| INTERVAL | Interval |
| KAART | KAART (2) |
| string | TEKENREEKS |
| STRUCTUUR | STRUCTUUR (2) |
| VARIANTE | Variant |
| OBJECT | OBJECT (3) |
(1) Voor de minst voorkomende typeresolutieFLOAT wordt overgeslagen om verlies van precisie te voorkomen.
(2) Voor een complex type wordt de prioriteitsregel recursief toegepast op de onderdeelelementen ervan.
(3)OBJECT bestaat alleen binnen een VARIANT.
Tekenreeksen en NULL
Speciale regels zijn van toepassing op STRING en niet-getypt NULL:
-
NULLkan worden gepromoveerd naar elk ander type. -
STRINGkan worden gepromoveerd totBIGINT,BINARY,BOOLEAN,DATE,DOUBLE, , enINTERVAL.TIMESTAMPAls de werkelijke tekenreekswaarde niet kan worden gecast naar het minst gangbare type , veroorzaakt Azure Databricks een runtimefout. Bij het bevorderen naarINTERVALmoet de tekenreekswaarde overeenkomen met de intervaleenheden.
Type voorrangsgrafiek
Dit is een grafische weergave van de prioriteitshiƫrarchie, waarin de typeprioriteitenlijst wordt gecombineerd met tekenreeksen en NULLs regels.
Minst voorkomende typeoplossing
Het minst voorkomende type van een set typen is het smalste type dat bereikbaar is vanuit de typeprioriteitsgrafiek door alle elementen van de set typen.
De minst gebruikelijke typeresolutie wordt gebruikt voor:
- 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 samenvoegen, in, minsteof grootste.
- De operandtypen afleiden voor operators zoals rekenkundige bewerkingen of vergelijkingen.
- Het resultaattype afleiden voor expressies zoals de case-expressie.
- De element-, sleutel- of waardetypen afleiden voor matrix- en kaartconstructors.
- Het resultaattype van UNION, INTERSECT of EXCEPT set-operatoren afleiden.
Er worden speciale regels toegepast als het minst gangbare 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 algemene type gepusht naar DOUBLE om potentieel verlies van cijfers te voorkomen.
Wanneer het minst voorkomende type een STRING is, wordt de sortering berekend volgens de sorteerregels.
Impliciete downcasting en crosscasting
Azure Databricks maakt alleen gebruik van deze vormen van impliciete cast-conversie bij aanroepen van functies en operatoren, en alleen waar de intentie ondubbelzinnig kan worden bepaald.
Impliciete downcasting
Impliciete downcasting converteert automatisch een breder type naar een smaller type zonder dat u expliciet de omzetting hoeft aan te geven. Downcasting is handig, maar het brengt het risico met zich mee van onverwachte runtime-fouten als de werkelijke waarde niet kan worden weergegeven in het smallere type.
Met downcasting wordt de lijst met prioriteitstypen in omgekeerde volgorde toegepast.
Impliciete crosscasting
Impliciete cross-casting cast een waarde van de ene typenfamilie naar de andere zonder dat u de casting expliciet hoeft op te geven.
Azure Databricks biedt ondersteuning voor impliciete crosscasting van:
- Elk eenvoudig type, met uitzondering van
BINARY, naarSTRING. - Een
STRINGtot elk eenvoudig type.
- Elk eenvoudig type, met uitzondering van
Casten bij functie-aanroep
Op basis van een opgeloste functie of operator zijn de volgende regels van toepassing, in de volgorde waarin ze worden vermeld, voor elke parameter en argumentpaar:
Als een ondersteund parametertype deel uitmaakt van de typeprioriteitsgrafiek van het argument, bevordert Azure Databricks het argument naar dat parametertype.
In de meeste gevallen geeft de functiebeschrijving expliciet de ondersteunde typen of ketens aan, zoals 'elk numeriek type'.
Sin(expr) werkt bijvoorbeeld op
DOUBLE, maar accepteert elke numerieke waarde.Als het verwachte parametertype een
STRINGis en het argument een eenvoudig type is, wordt het argument door Azure Databricks geconverteerd naar het tekenreeksparametertype.Bijvoorbeeld, substr(str, start, len) verwacht dat
streenSTRINGis. In plaats daarvan kunt u een numeriek of datum/tijd-type doorgeven.Als het argumenttype een
STRINGis en het verwachte parametertype een eenvoudig type is, wordt het tekenreeksargument door Azure Databricks gekruist naar het breedste ondersteunde parametertype.Bijvoorbeeld: date_add(datum, dagen) verwacht een
DATEen eenINTEGER.Als u
date_add()aanroept met tweeSTRINGs, zal Azure Databricks de eerste naarSTRINGen de tweedeDATEnaar eenSTRINGcrosscasten.Als de functie een numeriek type verwacht, zoals een
INTEGERof eenDATEtype, maar het argument een meer algemeen type is, zoals eenDOUBLEofTIMESTAMP, dan downcast Azure Databricks het argument impliciet naar dat parametertype.Een date_add(datum, dagen) verwacht bijvoorbeeld een
DATEen eenINTEGER.Als u
date_add()met eenTIMESTAMPen eenBIGINTaanroept, zet Azure Databricks de om door het tijdcomponent te verwijderen en zet deTIMESTAMPnaar eenDATEom.Anders genereert Azure Databricks een fout.
Voorbeelden
De coalesce functie accepteert een set argumenttypen zolang ze een minst gangbaar type hebben.
Het resultaattype is het minst voorkomende type van de 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: DATATYPE_MISMATCH.DATA_DIFF_TYPES
-- 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: CAST_INVALID_INPUT
-- The least common type between a DECIMAL and a STRING is a DOUBLE
> SELECT typeof(coalesce(1BD, '6'));
DOUBLE
-- Two distinct explicit collations result in an error
> SELECT collation(coalesce('hello' COLLATE UTF8_BINARY,
'world' COLLATE UNICODE));
Error: COLLATION_MISMATCH.EXPLICIT
-- The resulting collation between two distinct implicit collations is indeterminate
> SELECT collation(coalesce(c1, c2))
FROM VALUES('hello' COLLATE UTF8_BINARY,
'world' COLLATE UNICODE) AS T(c1, c2);
NULL
-- The resulting collation between a explicit and an implicit collations is the explicit collation.
> SELECT collation(coalesce(c1 COLLATE UTF8_BINARY, c2))
FROM VALUES('hello',
'world' COLLATE UNICODE) AS T(c1, c2);
UTF8_BINARY
-- The resulting collation between an implicit and the default collation is the implicit collation.
> SELECT collation(coalesce(c1, 'world'))
FROM VALUES('hello' COLLATE UNICODE) AS T(c1, c2);
UNICODE
-- The resulting collation between the default collation and the indeterminate collation is the default collation.
> SELECT collation(coalesce(coalesce('hello' COLLATE UTF8_BINARY, 'world' COLLATE UNICODE), 'world'));
UTF8_BINARY
De substring functie 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
|| (CONCAT) staat toe dat waarden impliciet naar een tekenreeks worden omgezet.
-- 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 STRINGs dankzij impliciete crosscasting.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05