Delen via


REGELS voor SQL-gegevenstypen

Van toepassing op:vinkje bij ja Databricks SQL vinkje bij ja Databricks Runtime

Azure Databricks gebruikt verschillende regels om conflicten tussen gegevenstypen op te lossen:

U kunt ook expliciet casten tussen veel typen:

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:

  • NULL kan worden gepromoveerd naar elk ander type.
  • STRINGkan worden gepromoveerd tot BIGINT, BINARY, BOOLEAN, DATE, DOUBLE, , en INTERVAL.TIMESTAMP Als de werkelijke tekenreekswaarde niet kan worden gecast naar het minst gangbare type , veroorzaakt Azure Databricks een runtimefout. Bij het bevorderen naar INTERVAL moet 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.

Grafische weergave van prioriteitsregels

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, naar STRING.
    • Een STRING tot elk eenvoudig type.

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 opDOUBLE, maar accepteert elke numerieke waarde.

  • Als het verwachte parametertype een STRING is en het argument een eenvoudig type is, wordt het argument door Azure Databricks geconverteerd naar het tekenreeksparametertype.

    Bijvoorbeeld, substr(str, start, len) verwacht dat str een STRING is. 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, wordt het tekenreeksargument door Azure Databricks gekruist naar het breedste ondersteunde parametertype.

    Bijvoorbeeld: date_add(datum, dagen) verwacht een DATE en een INTEGER.

    Als u date_add() aanroept met twee STRINGs, zal Azure Databricks de eerste naar STRING en de tweede DATE naar een STRING crosscasten.

  • Als de functie een numeriek type verwacht, zoals een INTEGER of een DATE type, maar het argument een meer algemeen type is, zoals een DOUBLE of TIMESTAMP, dan downcast Azure Databricks het argument impliciet naar dat parametertype.

    Een date_add(datum, dagen) verwacht bijvoorbeeld een DATE en een INTEGER.

    Als u date_add() met een TIMESTAMP en een BIGINT aanroept, zet Azure Databricks de om door het tijdcomponent te verwijderen en zet de TIMESTAMP naar een DATE om.

  • 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