REGLER för SQL-datatyp

Gäller för:check markerad ja Databricks SQL-kontroll markerad ja Databricks Runtime

Azure Databricks använder flera regler för att lösa konflikter mellan datatyper:

Du kan också uttryckligen casta mellan många typer:

Typhöjning

Typhöjning är processen för att omvandla en typ till en annan typ av samma typfamilj som innehåller alla möjliga värden för den ursprungliga typen. Därför är typhöjning en säker åtgärd. Till exempel TINYINT har ett intervall från -128 till 127. Alla möjliga värden kan höjas upp på ett säkert sätt till INTEGER.

Typprioritetslista

Typprioritetslistan definierar om värden för en viss datatyp implicit kan höjas upp till en annan datatyp.

Datatyp Prioritetslista (från smalaste till bredaste)
TINYINT TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DUBBEL
SMALLINT SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DUBBEL
INT INT –> BIGINT –> DECIMAL –> FLYTTAL (1) –> DUBBEL
BIGINT BIGINT -> DECIMAL -> FLOAT (1) -> DUBBEL
DECIMAL DECIMAL -> FLOAT (1) –> DUBBEL
FLYTA FLOAT (1) –> DUBBEL
DUBBEL DUBBEL
DATUM DATUM –> TIDSSTÄMPEL
TIDSSTÄMPEL TIDSSTÄMPEL
ARRAY MATRIS (2)
BINÄRA BINÄRA
BOOLEAN BOOLEAN
INTERVALL INTERVALL
KARTA MAP (2)
STRÄNG STRÄNG
STRUCT STRUCT (2)

(1) För minsta vanliga typmatchning hoppas FLOAT över för att undvika förlust av precision.

(2) För en komplex typ gäller prioritetsregeln rekursivt för dess komponentelement.

Strängar och NULL

Särskilda regler gäller för STRING och otypade NULL:

  • NULL kan höjas upp till någon annan typ.
  • STRING kan befordras till BIGINT, BINARY, BOOLEAN, DATE, DOUBLE, INTERVALoch TIMESTAMP. Om det faktiska strängvärdet inte kan omvandlas till minsta vanliga typ genererar Azure Databricks ett körningsfel. När du befordrar till INTERVAL strängvärdet måste det matcha intervallenheterna.

Typprioritetsdiagram

Det här är en grafisk beskrivning av prioritetshierarkin, som kombinerar typprioritetslistan och strängar och NULLs-regler .

Grafisk representation av prioritetsregler

Minsta vanliga typmatchning

Den minst vanliga typen från en uppsättning typer är den smalaste typen som kan nås från typprioritetsdiagrammet av alla element i uppsättningen av typer.

Den minsta vanliga typmatchningen används för att:

  • Bestäm om en funktion som förväntar sig en parameter av en viss typ kan anropas med ett argument av en smalare typ.
  • Härled argumenttypen för en funktion som förväntar sig en delad argumenttyp för flera parametrar, till exempel coalesce, in, least eller greatest.
  • Härled operandtyperna för operatorer som aritmetiska åtgärder eller jämförelser.
  • Härled resultattypen för uttryck som skiftlägesuttrycket.
  • Härled element-, nyckel- eller värdetyperna för matris- och kartkonstruktorer.
  • Härled resultattypen för UNION-, INTERSECT- eller EXCEPT-uppsättningsoperatorer .

Särskilda regler tillämpas om den minst vanliga typen matchar .FLOAT Om någon av de bidragande typerna är en exakt numerisk typ (TINYINT, , INTEGERSMALLINT, BIGINTeller DECIMAL) pushas den minst vanliga typen för att DOUBLE undvika potentiell förlust av siffror.

Implicit nedkastning och korscasting

Azure Databricks använder dessa former av implicit gjutning endast för funktions- och operatörsanrop, och endast där det entydigt kan fastställa avsikten.

  • Implicit nedcasting

    Implicit nedkastning omvandlar automatiskt en bredare typ till en smalare typ utan att du uttryckligen behöver ange casten. Nedkastning är praktiskt, men det medför risk för oväntade körningsfel om det faktiska värdet inte kan representeras i den smala typen.

    Nedcasting tillämpar typprioritetslistan i omvänd ordning.

  • Implicit korscasting

    Implicit korscasting genererar ett värde från en typfamilj till en annan utan att du uttryckligen behöver ange casten.

    Azure Databricks stöder implicit korscasting från:

    • Valfri enkel typ, förutom BINARY, till STRING.
    • A STRING till valfri enkel typ.

Gjutning av funktionsanrop

Med tanke på en löst funktion eller operator gäller följande regler, i den ordning de anges, för varje parameter och argumentpar:

  • Om en parametertyp som stöds är en del av argumentets typprioritetsdiagramhöjer Azure Databricks argumentet till den parametertypen.

    I de flesta fall anger funktionsbeskrivningen uttryckligen vilka typer eller kedja som stöds, till exempel "valfri numerisk typ".

    Till exempel fungerar sin(expr)DOUBLE men accepterar alla numeriska.

  • Om den förväntade parametertypen är en STRING och argumentet är en enkel typ korscastar Azure Databricks argumentet till strängparametertypen.

    Till exempel förväntar sig strsubstr(str, start, len) att vara en STRING. I stället kan du skicka en numerisk typ eller datetime-typ.

  • Om argumenttypen är en STRING och den förväntade parametertypen är en enkel typ , korscastar Azure Databricks strängargumentet till den bredaste parametertypen som stöds.

    Till exempel förväntar sig date_add(datum, dagar) en DATE och en INTEGER.

    Om du anropar date_add() med två STRINGs korscastar Azure Databricks den första STRING till DATE och den andra STRING till en INTEGER.

  • Om funktionen förväntar sig en numerisk typ, till exempel en INTEGER, eller en DATE typ, men argumentet är en mer allmän typ, till exempel en DOUBLE eller TIMESTAMP, nedarbetar Azure Databricks implicit argumentet till den parametertypen.

    Till exempel förväntar sig en date_add(datum, dagar) en DATE och en INTEGER.

    Om du anropar date_add() med en TIMESTAMP och en BIGINT, nedarbetarTIMESTAMP Azure Databricks till genom att DATE ta bort tidskomponenten och BIGINT till en INTEGER.

  • Annars genererar Azure Databricks ett fel.

Exempel

Funktionen coalesce accepterar alla typer av argument så länge de delar en minst vanlig typ.

Resultattypen är den minst vanliga typen av argument.

-- 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

Delsträngsfunktionen förväntar sig argument av typen STRING för strängen och INTEGER för parametrarna start och längd.

-- 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) tillåter implicit korscasting till sträng.

-- 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 anropas med en TIMESTAMP eller BIGINT på grund av implicit nedcasting.

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

date_add kan anropas med STRINGs på grund av implicit korscasting.

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