Regole del tipo di dati SQL

Si applica a:check contrassegnato con sì controllo SQL di Databricks contrassegnato con sì Databricks Runtime

Azure Databricks usa diverse regole per risolvere i conflitti tra i tipi di dati:

È anche possibile eseguire il cast esplicito tra molti tipi:

Promozione dei tipi

L'innalzamento dei tipi è il processo di cast di un tipo in un altro tipo della stessa famiglia di tipi che contiene tutti i valori possibili del tipo originale. Pertanto, l'innalzamento di tipo è un'operazione sicura. Ad esempio TINYINT , ha un intervallo compreso tra -128 e 127. Tutti i valori possibili possono essere promossi in modo sicuro a INTEGER.

Elenco di precedenza dei tipi

L'elenco di precedenza dei tipi definisce se i valori di un determinato tipo di dati possono essere promossi in modo implicito a un altro tipo di dati.

Tipo di dati Elenco di precedenza (dal più stretto al più ampio)
TINYINT TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
SMALLINT SMALLINT - INT ->> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
INT INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
BIGINT BIGINT - DECIMAL ->> FLOAT (1) -> DOUBLE
DECIMALE DECIMAL -> FLOAT (1) -> DOUBLE
GALLEGGIANTE FLOAT (1) -> DOUBLE
DOPPIA DOPPIA
DATA DATE -> TIMESTAMP
TIMESTAMP TIMESTAMP
MATRICE MATRICE (2)
BINARIO BINARIO
BOOLEAN BOOLEAN
INTERVALLO INTERVALLO
MAPPA MAP (2)
STRINGA STRINGA
STRUCT STRUCT (2)

(1) Per la risoluzione dei tipi meno comune FLOAT viene ignorato per evitare la perdita di precisione.

(2) Per un tipo complesso, la regola di precedenza si applica in modo ricorsivo ai relativi elementi componente.

Stringhe e NULL

Si applicano regole speciali per STRING e non tipizzati NULL:

  • NULL può essere alzato di livello a qualsiasi altro tipo.
  • STRINGpuò essere alzato di livello a BIGINT, BINARY, BOOLEAN, DATEDOUBLE, INTERVALe TIMESTAMP. Se non è possibile eseguire il cast del valore stringa effettivo al tipo meno comune di Azure Databricks, viene generato un errore di runtime. Quando si alza di livello INTERVAL il valore stringa deve corrispondere alle unità di intervallo.

Grafico di precedenza dei tipi

Si tratta di una rappresentazione grafica della gerarchia di precedenza, combinando l'elenco di precedenza dei tipi e le stringhe e le regole NULL .

Rappresentazione grafica delle regole di precedenza

Risoluzione dei tipi meno comuni

Il tipo meno comune di un set di tipi è il tipo più stretto raggiungibile dal grafico di precedenza del tipo da tutti gli elementi del set di tipi.

La risoluzione dei tipi meno comune viene usata per:

  • Decidere se una funzione che prevede un parametro di un determinato tipo può essere richiamata usando un argomento di un tipo più stretto.
  • Derivare il tipo di argomento per una funzione che prevede un tipo di argomento condiviso per più parametri, ad esempio coalesce, in, least o greatest.
  • Derivare i tipi di operando per operatori come operazioni aritmetiche o confronti.
  • Derivare il tipo di risultato per le espressioni, ad esempio l'espressione case.
  • Derivare i tipi di elemento, chiave o valore per i costruttori di matrice e di mapping .
  • Derivare il tipo di risultato degli operatori set UNION, INTERSECT o EXCEPT .

Le regole speciali vengono applicate se il tipo meno comune viene risolto in FLOAT. Se uno dei tipi che contribuiscono è un tipo numerico esatto (TINYINT, SMALLINT, INTEGER, BIGINTo DECIMAL) viene eseguito il push del tipo meno comune per DOUBLE evitare la potenziale perdita di cifre.

Downcast implicito e crosscast

Azure Databricks usa questi tipi di cast implicito solo sulla chiamata di funzioni e operatori e solo in cui può determinare in modo univoco la finalità.

  • Downcast implicito

    Il downcast implicito esegue automaticamente il cast di un tipo più ampio a un tipo più stretto senza che sia necessario specificare il cast in modo esplicito. Il downcast è pratico, ma comporta il rischio di errori di runtime imprevisti se il valore effettivo non può essere rappresentato nel tipo narrow.

    Il downcast applica l'elenco di precedenza del tipo in ordine inverso.

  • Crosscast implicito

    Il crosscast implicito esegue il cast di un valore da una famiglia di tipi a un altro senza che sia necessario specificare il cast in modo esplicito.

    Azure Databricks supporta il crosscast implicito da:

    • Qualsiasi tipo semplice, ad eccezione BINARYdi , a STRING.
    • Oggetto STRING a qualsiasi tipo semplice.

Cast alla chiamata di funzione

Data una funzione o un operatore risolto, si applicano le regole seguenti, nell'ordine in cui sono elencate, per ogni parametro e coppia di argomenti:

  • Se un tipo di parametro supportato fa parte del grafico di precedenza del tipo dell'argomento, Azure Databricks promuove l'argomento a tale tipo di parametro.

    Nella maggior parte dei casi la descrizione della funzione indica in modo esplicito i tipi o la catena supportati, ad esempio "qualsiasi tipo numerico".

    Ad esempio, sin(expr) opera su DOUBLE ma accetterà qualsiasi valore numerico.

  • Se il tipo di parametro previsto è e STRING l'argomento è un tipo semplice, Azure Databricks crosscasts esegue il crosscast dell'argomento al tipo di parametro stringa.

    Ad esempio, substr(str, start, len) prevede str che sia .STRING È invece possibile passare un tipo numerico o datetime.

  • Se il tipo di argomento è e STRING il tipo di parametro previsto è un tipo semplice, Azure Databricks crosscasts esegue il crosscast dell'argomento stringa al tipo di parametro supportato più ampio.

    Ad esempio, date_add(date, days) prevede un oggetto e un DATE oggetto INTEGER.

    Se si richiama date_add() con due STRINGs, Il crosscast di Azure Databricks esegue il crosscast tra il primo STRING e DATE il secondo STRING in un oggetto INTEGER.

  • Se la funzione prevede un tipo numerico, ad esempio , INTEGERo un DATE tipo, ma l'argomento è un tipo più generale, ad esempio o DOUBLETIMESTAMP, Azure Databricks esegue implicitamente il downcast dell'argomento a tale tipo di parametro.

    Ad esempio, un date_add(date, days) prevede un oggetto e un DATE oggetto INTEGER.

    Se si richiama date_add() con e TIMESTAMP , BIGINTAzure Databricks esegue il downcast di TIMESTAMP a DATE rimuovendo il componente time e l'oggetto BIGINT in un oggetto INTEGER.

  • In caso contrario, Azure Databricks genera un errore.

Esempi

La funzione coalesce accetta qualsiasi set di tipi di argomento purché condividono un tipo meno comune.

Il tipo di risultato è il tipo meno comune degli argomenti.

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

La funzione di sottostringa prevede argomenti di tipo STRING per la stringa e INTEGER per i parametri di inizio e lunghezza.

-- 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) consente il crosscast implicito su stringa.

-- 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 può essere richiamato con o TIMESTAMPBIGINT a causa del downcast implicito.

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

date_add può essere richiamato con STRINGs a causa del crosscast implicito.

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