SQL regler för datatyp

Databricks Runtime använder flera regler för att lösa konflikter mellan datatyper. Kärnan i den här konfliktlösningen är listan med prioritetstyper som definierar om värden för en viss datatyp kan befordras implicit till en annan datatyp.

När en Databricks Runtime anropar en funktion använder den dessutom implicit downcasting och crosscasting för att matcha funktionsargument till funktionsparametrar där det är möjligt.

Typ prioritet

Databricks Runtime använder flera regler som styr hur konflikter mellan datatyper löses. Kärnan i den här konfliktlösningen är listan med prioritetstyper som definierar om värden för en viss datatyp kan befordras implicit till en annan datatyp.

Datatyp Prioritetslista (från smalaste till bredaste)
TINYINT TINYINT – > SMALLINT – > INT – > BIGINT > – DECIMAL – > FLYTTAL – > DOUBLE
SMALLINT SMALLINT – > INT – > BIGINT – > DECIMAL – >> – > DOUBLE
INT INT – > BIGINT – > DECIMAL – > FLYTTAL > – > DOUBLE
BIGINT BIGINT – > DECIMAL – >> – > DOUBLE
DECIMAL DECIMAL – >> – > DOUBLE
FLYTA FLOAT (1) DOUBLE
DOUBLE DOUBLE
DATE DATUM – > TIDSSTÄMPEL
TIMESTAMP TIMESTAMP
ARRAY MATRIS (2)
BINARY BINARY
BOOLEAN BOOLEAN
INTERVALL INTERVALL
KARTA KARTA (2)
STRÄNG STRÄNG
STRUCT STRUCT (2)

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

(2) För en komplex typ tillämpas prioritetsregeln rekursivt på dess komponentelement.

Stränglitteraler och NULL

Särskilda regler gäller för stränglitteraler och null utan tecken.

Null-värden kan upphöjas till andra typer. En stränglitteral kan upphöjas till valfri enkel datatyp.

Det här är en grafisk beskrivning av prioritetshierarkin:

Graphical representation of precedence rules

Minsta vanliga typmatchning

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

Den minst vanliga typen av lösning används för att:

  • Bestäm om en funktion som förväntar sig en parameter av en viss typ kan anropas med hjälp av 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, i, minsteller störst.
  • Härled operandtyperna för operatorer som aritmetiska operationer eller jämförelser.
  • Härled resultattypen för uttryck som case-uttrycket.
  • Härled element-, nyckel- eller värdetyper för matris- ochmappningskonstruktorer.
  • Härled resultattypen för operatorerna UNION, INTERSECT eller EXCEPT set.

Särskilda regler tillämpas om den minst vanliga typen matchar FLOAT:

Om någon av de bidragande typerna är , eller om den minst vanliga typen skickas till för att INTEGER undvika potentiell förlust av BIGINTDECIMALDOUBLE siffror.

Implicit nedcasting och crosscasting

Databricks Runtime använder dessa former av implicit återgivning endast vid funktions- och operatörsanrop, och endast när den kan fastställa avsikten entydigt.

  • Implicit nedcasting

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

  • Implicit crosscasting

    Implicit crosscasting kastar ett värde från en typfamilj till en annan utan att du uttryckligen behöver ange typtypen. Databricks Runtime har stöd för implicit typsning från valfri STRING enkel typ till , men inte tvärtom. En literal kan dock typas till en annan enkel typ, eftersom Databricks Runtime kan härleda säkerheten för STRING typeringen under frågekompileringen. Även om värden av alla enkla typer kan representeras som s, är detta naturligtvis inte fallet när STRING du STRING översätter ett värde till någon annan enkel typ.

Rollberop vid funktionsanrop

Med en löst funktion eller operator gäller följande regler i den ordning som de visas för varje parameter och argumentpar:

  • Om en parametertyp som stöds är en del av argumentets prioritetskedja för typ Databricks Runtime argumentet till den parametertypen.

    I de flesta fall anger funktionsbeskrivningen uttryckligen vilka typer eller kedjor som stöds, till exempel "numeriska typer".

    Till exempel fungerar sin(expr) men accepterar alla numeriska värden.

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

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

  • Om funktionen förväntar sig en numerisk typ, till exempel en , eller en typ, men argumentet är en mer allmän typ, till exempel en eller , kommer Databricks Runtime implicit att nedströms argumentet till den INTEGERDATEDOUBLETIMESTAMP parametertypen.

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

    Om du anropar med en och Databricks Runtime ned till genom date_add() att ta bort TIMESTAMPBIGINTTIMESTAMPDATE tidskomponenten och BIGINT till en INTEGER .

  • Annars Databricks Runtime ett fel.

Exempel

Funktionen coalesce accepterar alla typer av argumenttyper så länge de har en minst gemensam 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
> 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

Funktionen för delsträng förväntar sig argument av typen för strängen och för INTEGER start- och längdparametrarna.

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

-- No crosscasting from STRING to INTEGER
> SELECT substring('hello', str, 2)
  FROM VALUES(CAST('1' AS STRING)) AS T(str);
Error: Argument 2 requires an INT type.

-- Crosscasting from INTEGER to STRING
> SELECT substring(12345, 2, 2);
 23

|| (CONCAT) tillåter implicit crosscasting 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 eller på grund av implicit BIGINT nedcasting.

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