SQL-gegevenstyperegels

Van toepassing op:controleren met ja Databricks SQL-controle gemarkeerd als ja Databricks Runtime

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

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.
  • STRINGkan worden gepromoveerd naar BIGINT, BOOLEANBINARY, , DATE, DOUBLE, INTERVALen TIMESTAMP. Als de werkelijke tekenreekswaarde niet kan worden omgezet naar het minst voorkomende type Azure Databricks, treedt er een runtimefout op. Bij het promoveren naar INTERVAL 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.

Grafische weergave van prioriteitsregels

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

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 opDOUBLE, 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 een STRINGte 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 een INTEGER.

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

  • 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, wordt het argument impliciet naar dat parametertype ge downcast door Azure Databricks.

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

    Als u aanroept date_add() met een TIMESTAMP en een BIGINT, downcastt Azure Databricks de TIMESTAMP naar DATE door het tijdonderdeel en de BIGINT te verwijderen naar een INTEGER.

  • 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 STRINGs vanwege impliciete crosscasting.

> SELECT date_add('2011-11-30 08:30:00', '5');
  2011-12-05