Reguły typów danych SQL
Dotyczy: wyboru SQL usługi Databricks
Databricks Runtime
Usługa Azure Databricks używa kilku reguł do rozwiązywania konfliktów między typami danych:
- Podwyższenie poziomu bezpiecznie rozszerza typ do szerszego typu.
- Niejawne zmniejszanie zmniejsza typ. Przeciwieństwo promocji.
- Niejawne przekształcanie krzyżowe przekształca typ w typ innej rodziny typów.
Można również jawnie rzutować między wieloma typami:
- rzutowanie funkcji między większością typów i zwraca błędy, jeśli nie może.
- try_cast funkcja działa jak funkcja rzutu , ale zwraca wartość NULL po przekazaniu nieprawidłowych wartości.
- Inne wbudowane funkcje rzutowane między typami przy użyciu dostarczonych dyrektyw formatu.
Typ podwyższania poziomu
Podwyższanie typu to proces rzutowania typu do innego typu tej samej rodziny typów, 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 mogą być bezpiecznie promowane do .INTEGER
Wpisz listę pierwszeństwa
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 | LICZBA DZIESIĘTNA —> LICZBA ZMIENNOPRZECINKOWA (1) —> PODWÓJNA |
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) W przypadku najmniejszej rozdzielczości typu FLOAT jest pomijane, aby uniknąć utraty precyzji.
(2) W przypadku typu złożonego reguła pierwszeństwa stosuje rekursywnie do jej elementów składowych.
Ciągi i wartości NULL
Zasady specjalne mają zastosowanie do STRING
i nietypowe NULL
:
NULL
można awansować do dowolnego innego typu.STRING
można awansować doBIGINT
, ,BINARY
,BOOLEAN
,DOUBLE
DATE
, ,INTERVAL
iTIMESTAMP
. Jeśli nie można rzutować rzeczywistej wartości ciągu na typ najmniej typowy typ usługi Azure Databricks, zgłasza błąd środowiska uruchomieniowego. Podczas podwyższania poziomu doINTERVAL
wartości ciągu musi być zgodna z jednostkami interwałów.
Wykres pierwszeństwa typu
Jest to graficzny obraz hierarchii pierwszeństwa, łącząc listę pierwszeństwa typów oraz ciągi i reguły NULLs .
Najmniej typowa rozdzielczość
Najmniej typowym typem z zestawu typów jest najwęższy typ osiągalny z wykresu pierwszeństwa typu przez wszystkie elementy zestawu typów.
Najmniejsza typowa rozdzielczość 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.
- Utwórz typ argumentu dla funkcji, która oczekuje współużytkowanego typu argumentu dla wielu parametrów, takich jak łączenie, w, najmniej lub najwspanialsze.
- Uzyskiwanie typów operandów dla operatorów, takich jak operacje arytmetyczne lub porównania.
- Utwórz typ wyniku dla wyrażeń, takich jak wyrażenie przypadku.
- Uzyskiwanie typów elementów, kluczy lub wartości dla konstruktorów tablicy i mapowania .
- Uzyskiwanie typu wyniku operatorów UNION, INTERSECT lub EXCEPT set.
Specjalne reguły są stosowane, jeśli typ najmniejszy typ jest rozpoznawany jako FLOAT
. Jeśli którykolwiek z typów współtworzenia jest dokładnym typem liczbowym (, , , BIGINT
, lub DECIMAL
) najmniej typowym typem jest wypchnięty, aby DOUBLE
uniknąć potencjalnej utraty INTEGER
cyfr. SMALLINT
TINYINT
Niejawne downcasting i crosscasting
Usługa Azure Databricks wykorzystuje te formy niejawnego rzutowania tylko w przypadku wywołania funkcji i operatora oraz tylko wtedy, gdy może jednoznacznie określić intencję.
Niejawne downcasting
Niejawne rzutowanie w dół automatycznie rzutuje szerszy typ na węższy typ bez konieczności jawnego określania rzutowania. Downcasting jest wygodny, 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 inną bez konieczności jawnego określania rzutowania.
Usługa Azure Databricks obsługuje niejawne crosscasting z:
- Dowolny prosty typ, z wyjątkiem
BINARY
, doSTRING
. - Od A
STRING
do dowolnego prostego typu.
- Dowolny prosty typ, z wyjątkiem
Rzutowanie przy wywołaniu funkcji
Biorąc pod uwagę rozpoznaną funkcję lub operator, obowiązują następujące reguły w kolejności, w której są wymienione, dla każdego parametru i pary argumentów:
Jeśli obsługiwany typ parametru jest częścią grafu pierwszeństwa typu argumentu, usługa Azure Databricks promuje 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 funkcja sin(expr) działa,
DOUBLE
ale zaakceptuje dowolną wartość liczbową.Jeśli oczekiwany typ parametru to
STRING
, a argument jest prostym typem, usługa Azure Databricks crosscasts argument do typu parametru ciągu.Na przykład 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
a oczekiwany typ parametru jest prostym typem, usługa Azure Databricks crosscasts argument ciągu do najszerszego obsługiwanego typu parametru.Na przykład date_add (data, dni) oczekuje wartości i
DATE
INTEGER
.W przypadku wywołania z
date_add()
dwomaSTRING
elementami usługa Azure Databricks wykonuje krzyżowe emisje pierwszegoSTRING
doDATE
i drugiegoSTRING
do .INTEGER
Jeśli funkcja oczekuje typu liczbowego, takiego jak , lub
DATE
typu, ale argument jest bardziej ogólnym typem, takim jakINTEGER
DOUBLE
lubTIMESTAMP
, usługa Azure Databricks niejawnie obniża argument do tego typu parametru.Na przykład date_add (data, dni) oczekuje wartości i
DATE
INTEGER
.Jeśli wywołasz
date_add()
element z elementemTIMESTAMP
i ,BIGINT
usługa Azure Databricks zdejmujeTIMESTAMP
element ,DATE
usuwając składnik time i elementBIGINT
do elementuINTEGER
.W przeciwnym razie usługa Azure Databricks zgłasza błąd.
Przykłady
Funkcja coalesce akceptuje dowolny zestaw typów argumentów, o ile mają one 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ątkowych 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ą STRING
s z powodu niejawnego przesiewu krzyżowego.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05