SQL reguły typów danych

Środowisko Databricks Runtime używa kilku reguł do rozwiązywania konfliktów między typami danych:

Można również jawnie rzutować między wieloma typami:

Typ podwyższania poziomu

Podwyższenie poziomu typu to proces rzutowania typu do innego typu rodziny tego samego typu, który zawiera wszystkie możliwe wartości oryginalnego typu. W związku z tym podwyższenie poziomu typu jest bezpieczną operacją. Na przykład TINYINT ma zakres od -128 do 127. Wszystkie możliwe wartości można bezpiecznie awansować do INTEGERelementu .

Lista pierwszeństwa typów

Lista pierwszeństwa typów określa, czy wartości danego typu danych mogą być niejawnie promowane do innego typu danych.

Typ danych Lista pierwszeństwa (od najwęższej do najszerszej)
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 -> DZIESIĘTNE -> FLOAT (1) -> DOUBLE
DZIESIĘTNYCH DZIESIĘTNE —> ZMIENNOPRZECINKOWE (1) —> PODWÓJNE
FLOAT FLOAT (1) —> PODWÓJNE
PODWÓJNE PODWÓJNE
DATE DATA —> SYGNATURA CZASOWA
SYGNATURY CZASOWEJ TIMESTAMP
TABLICY TABLICA (2)
BINARNYM BINARNYM
BOOLEAN BOOLEAN
INTERWAŁ INTERWAŁ
MAPĘ MAP (2)
CIĄG CIĄG
STRUCT STRUKTURA (2)

(1) Aby uniknąć utraty precyzji, jest pomijana funkcja FLOAT o najmniejszej rozdzielczości typu.

(2) W przypadku typu złożonego reguła pierwszeństwa jest cyklicznie stosowana do jego elementów składników.

Ciągi i null

Obowiązują zasady specjalne i STRING nietypowe NULL:

  • NULL można awansować do dowolnego innego typu.
  • STRINGmożna awansować do BIGINT, , BINARY, BOOLEAN, DOUBLEDATE, , INTERVALi TIMESTAMP. Jeśli nie można rzutować rzeczywistej wartości ciągu do najmniej typowego typu Databricks Runtime, zgłasza błąd środowiska uruchomieniowego. Podczas podwyższania poziomu do INTERVAL wartości ciągu musi być zgodna z jednostkami interwałów.

Wykres pierwszeństwa typu

Jest to graficzna ilustracja hierarchii pierwszeństwa, łącząca listę pierwszeństwa typów oraz ciągi i reguły NULLs .

Graphical representation of precedence rules

Najmniej typowa rozdzielczość

Najmniej typowym typem z zestawu typów jest najwęższy typ osiągalny z grafu pierwszeństwa typu przez wszystkie elementy zestawu typów.

Najmniej typowego rozpoznawania jest używana do:

  • Zdecyduj, czy funkcja, która oczekuje parametru danego typu, może być wywoływana przy użyciu argumentu węższego typu.
  • Wyprowadzanie typu argumentu dla funkcji, która oczekuje współużytkowanego typu argumentu dla wielu parametrów, takich jak coalesce, in, least lub greatest.
  • Wyprowadzanie typów operandów dla operatorów, takich jak operacje arytmetyczne lub porównania.
  • Wyprowadzanie typu wyniku dla wyrażeń, takich jak wyrażenie przypadku.
  • Wyprowadzanie typów elementów, kluczy lub wartości dla konstruktorów tablicy i mapowania .
  • Wyprowadzanie typu wyniku operatorów UNION, INTERSECT lub EXCEPT .

Reguły specjalne są stosowane, jeśli najmniej typowy typ jest rozpoznawany jako FLOAT. Jeśli którykolwiek z typów współtworzenia jest dokładnym typem liczbowym (TINYINT, SMALLINT, INTEGER, BIGINTlub DECIMAL) najmniej typowy typ jest wypychany, aby DOUBLE uniknąć potencjalnej utraty cyfr.

Niejawne downcasting i crosscasting

Środowisko Databricks Runtime stosuje te formy niejawnego rzutowania tylko w wywołaniu funkcji i operatora oraz tylko wtedy, gdy może jednoznacznie określić intencję.

  • Niejawne obniżanie

    Niejawne zmniejszanie automatycznie rzutuje szerszy typ na węższy typ bez konieczności jawnego określenia rzutowania. Obniżanie jest wygodne, ale wiąże się z ryzykiem nieoczekiwanych błędów środowiska uruchomieniowego, jeśli rzeczywista wartość nie może być reprezentowana w wąskim typie.

    Downcasting stosuje listę pierwszeństwa typów w odwrotnej kolejności.

  • Niejawne crosscasting

    Niejawne rzutowanie krzyżowe rzutuje wartość z jednej rodziny typów na drugą bez konieczności jawnego określenia rzutowania.

    Środowisko Databricks Runtime obsługuje niejawne krzyżowe emisje z:

    • Dowolny prosty typ, z wyjątkiem BINARY, do STRING.
    • A STRING do dowolnego prostego typu.

Rzutowanie na wywołanie funkcji

Biorąc pod uwagę rozpoznaną funkcję lub operator, obowiązują następujące reguły w kolejności, w której są one wymienione, dla każdego parametru i pary argumentów:

  • Jeśli obsługiwany typ parametru jest częścią grafu pierwszeństwa typu argumentu, środowisko Databricks Runtime podwyższa argument do tego typu parametru.

    W większości przypadków opis funkcji jawnie określa obsługiwane typy lub łańcuch, takie jak "dowolny typ liczbowy".

    Na przykład sin(expr) działa na, DOUBLE ale zaakceptuje dowolną liczbę.

  • Jeśli oczekiwany typ parametru jest STRING a argument jest prostym typem Databricks Runtime crosscasts argument do typu parametru ciągu.

    Na przykład parametr substr(str, start, len) oczekuje str wartości STRING. Zamiast tego można przekazać typ liczbowy lub data/godzina.

  • Jeśli typ argumentu to STRING i oczekiwany typ parametru jest prostym typem, środowisko Databricks Runtime crosscasts argument ciągu do najszerszego obsługiwanego typu parametru.

    Na przykład date_add (data, dni) oczekuje wartości DATE i INTEGER.

    W przypadku wywołania date_add() z dwoma STRINGs, środowisko Databricks Runtime crosscasts pierwsze STRING do DATE i drugie STRING do .INTEGER

  • Jeśli funkcja oczekuje typu liczbowego, takiego jak INTEGER, lub DATE typu, ale argument jest bardziej ogólnym typem, takim jak DOUBLE lub TIMESTAMP, Databricks Runtime niejawnie obniża argument do tego typu parametru.

    Na przykład date_add (data, dni) oczekuje wartości DATE i INTEGER.

    Jeśli wywołasz date_add() element z elementem BIGINTTIMESTAMP i , środowisko Databricks Runtime przesunieTIMESTAMP element w DATE dół, usuwając składnik time i element BIGINT do elementu INTEGER.

  • W przeciwnym razie środowisko Databricks Runtime zgłasza błąd.

Przykłady

Funkcja coalesce akceptuje dowolny zestaw typów argumentów, o ile mają najmniej wspólny typ.

Typ wyniku jest najmniej typowym typem argumentów.

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

Funkcja podciągów oczekuje argumentów typu STRING dla ciągu oraz INTEGER parametrów początku i długości.

-- 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) umożliwia niejawne crosscasting do ciągu.

-- 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 można wywołać za pomocą elementu TIMESTAMP lub BIGINT z powodu niejawnego downcastingu.

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

date_add można wywołać za pomocą STRINGfunkcji s z powodu niejawnego crosscastingu.

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