Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:
Databricks SQL
Databricks Runtime
Azure Databricks používá k řešení konfliktů mezi datovými typy několik pravidel:
- Povýšení bezpečně rozšíří typ na širší typ.
- Implicitní downcasting zúží typ. Opak povýšení je degradace.
- Implicitní křížové přetypování převádí typ na typ jiné rodiny typů.
Můžete také explicitně přetypovat mezi mnoha typy:
- Funkce pro přetypování provádí přetypování mezi většinou typů a vrací chyby, pokud přetypování není možné.
- funkce try_cast funguje jako funkce cast, ale při předání neplatných hodnot vrátí hodnotu NULL.
- Jiné předdefinované funkce přetypovat mezi datovými typy pomocí zadaných formátovacích direktiv.
Povýšení typu
Povýšení typu je proces přetypování typu do jiného typu stejné řady typů, která obsahuje všechny možné hodnoty původního typu.
Povýšení typu je proto bezpečná operace. Například TINYINT má rozsah od -128 do 127. Všechny jeho možné hodnoty mohou být bezpečně povýšeny na INTEGER.
Seznam priorit typů
Seznam priorit typů definuje, jestli lze hodnoty daného datového typu implicitně upřednostnět na jiný datový typ.
| Datový typ | Seznam priorit (od nejužšího po nejširší) |
|---|---|
| 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 |
| DECIMAL | DESETINNÉ ČÍSLO -> FLOAT (1) -> DOUBLE |
| FLOAT | FLOAT (1) -> DOUBLE |
| DOUBLE | DOUBLE |
| DATE | DATUM –> ČASOVÉ RAZÍTKO |
| TIMESTAMP | TIMESTAMP |
| ARRAY | POLE (2) |
| BINARY | BINARY |
| BOOLEAN | BOOLEAN |
| INTERVAL | INTERVAL |
| ZEMĚPIS | GEOGRAFIE(ANY) |
| GEOMETRIE | GEOMETRIE(JAKÝKOLIV) |
| MAP | MAP (2) |
| STRING | STRING |
| STRUCT | STRUKTURA (2) |
| VARIANT | VARIANT |
| OBJECT | OBJEKT (3) |
(1) Pro nejběžnější rozlišení typuFLOAT je přeskočeno, aby se předešlo ztrátě přesnosti.
(2) U komplexního typu se pravidlo priority rekurzivně vztahuje na jeho prvky komponent.
(3)OBJECT existuje pouze v rámci VARIANT.
Řetězce a NULL
Zvláštní pravidla platí pro STRING a nezatypovaná NULL:
-
NULLlze povýšit na jakýkoli jiný typ. -
STRINGmohou být povýšeny naBIGINT, ,BINARY,BOOLEANDATE,DOUBLE, ,INTERVALaTIMESTAMP. Pokud skutečnou hodnotu řetězce nelze přetypovat na nejméně běžný typ Azure Databricks, vyvolá chybu za běhu. Při povýšení naINTERVALse hodnota řetězce musí shodovat s jednotky intervalů.
Graf priorit typů
Toto je grafické znázornění hierarchie priorit, kombinování seznamu priorit typů a řetězců a pravidel NULL .
Nejméně běžné rozlišení typu
Nejmenší společný typ ze sady typů je nejužší typ dostupný z grafu priorit typů všemi prvky sady typů.
Nejméně běžné rozlišení typu se používá k:
- Rozhodněte se, jestli je možné vyvolat funkci, která očekává parametr daného typu, pomocí argumentu užšího typu.
- Odvodit typ argumentu pro funkci, která očekává sdílený typ argumentu pro více parametrů, jako je coalesce, in, least nebo greatest.
- Odvozujte typy operandů pro operátory, jako jsou aritmetické operace nebo porovnání.
- Odvoďte typ výsledku pro výrazy, jako je případový výraz.
- Odvození elementu, klíče nebo hodnotových typů pro pole a mapové konstruktory
- Odvoďte výsledný typ množinových operátorů UNION, INTERSECT nebo EXCEPT.
Speciální pravidla se použijí, pokud se nejméně běžný typ přeloží na FLOAT. Pokud některý z přispívajících typů je přesný číselný typ (TINYINT, SMALLINT, INTEGER, BIGINT, nebo DECIMAL), je nejméně společný typ přesunut do DOUBLE, aby se zabránilo potenciální ztrátě číslic.
Pokud je nejmenším běžným typem STRING, kolace se vypočítá podle pravidel priority kolace .
Implicitní downcasting a křížové vysílání
Azure Databricks využívá tyto formy implicitního přetypování pouze pro vyvolání funkce a operátoru a pouze tam, kde může jednoznačně určit záměr.
Implicitní downcasting
Implicitní downcasting automaticky přetypuje obecnější typ na specifičtější typ, aniž byste museli explicitně zadat přetypování. Downcasting je pohodlný, ale nese riziko neočekávaných chyb za běhu, pokud skutečná hodnota není reprezentovatelná v úzkém typu.
Downcasting použije seznam priorit typů v obráceném pořadí.
GEOGRAPHYaGEOMETRYdatové typy se nikdy neprovádí pokles typu.
Implicitní křížové vysílání
Implicitní křížové přetypování převede hodnotu z jedné skupiny typů na jinou, aniž byste museli explicitně zadat tuto změnu.
Azure Databricks podporuje implicitní křížové vysílání z:
- Jakýkoli jednoduchý typ, s výjimkou
BINARY,GEOGRAPHYaGEOMETRY, doSTRING. - A
STRINGna jakýkoli jednoduchý typ, s výjimkouGEOGRAPHYaGEOMETRY.
- Jakýkoli jednoduchý typ, s výjimkou
Přetypování při vyvolání funkce
Vzhledem k vyřešené funkci nebo operátoru platí následující pravidla v pořadí, v jakém jsou uvedeny, pro každý parametr a dvojici argumentů:
Pokud je podporovaný typ parametru součástí grafu priority typu argumentu, Azure Databricks podporuje argument na tento typ parametru.
Ve většině případů popis funkce explicitně uvádí podporované typy nebo řetěz, například "jakýkoli číselný typ".
Například sin(výraz) funguje s
DOUBLE, ale přijme jakoukoli číselnou hodnotu.Pokud je očekávaný typ parametru
STRINGa argument je jednoduchý typ, Azure Databricks upraví argument na typ parametru řetězce.Například substr(str, start, délka) očekává, že
strbudeSTRING. Místo toho můžete předat číselný nebo typ data a času.Pokud je typ argumentu
STRINGa očekávaný typ parametru je jednoduchý typ, Azure Databricks křížově přetypuje řetězcový argument na nejširší podporovaný typ parametru.Například date_add(datum, dny) očekává
DATEaINTEGER.Pokud zavoláte
date_add()se dvěmaSTRING, Azure Databricks převede prvníSTRINGnaDATEa druhýSTRINGnaINTEGER.Pokud funkce očekává číselný typ, například typ
INTEGER, nebo typDATE, ale argument je obecnější typ, napříkladDOUBLEneboTIMESTAMP, Azure Databricks implicitně přetypovává argument na tento typ parametru.Například date_add(datum, dny) očekává
DATEaINTEGER.Pokud vyvoláte
date_add()sTIMESTAMPaBIGINT, Azure Databricks přetypováváTIMESTAMPnaDATEodebráním časové komponenty aBIGINTnaINTEGER.V opačném případě Azure Databricks vyvolá chybu.
Examples
Funkcecoalesce přijímá libovolnou sadu typů argumentů, pokud sdílejí nejméně společný typ.
Typ výsledku je nejmenším běžným typem 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: DATATYPE_MISMATCH.DATA_DIFF_TYPES
-- 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: CAST_INVALID_INPUT
-- The least common type between a DECIMAL and a STRING is a DOUBLE
> SELECT typeof(coalesce(1BD, '6'));
DOUBLE
-- Two distinct explicit collations result in an error
> SELECT collation(coalesce('hello' COLLATE UTF8_BINARY,
'world' COLLATE UNICODE));
Error: COLLATION_MISMATCH.EXPLICIT
-- The resulting collation between two distinct implicit collations is indeterminate
> SELECT collation(coalesce(c1, c2))
FROM VALUES('hello' COLLATE UTF8_BINARY,
'world' COLLATE UNICODE) AS T(c1, c2);
NULL
-- The resulting collation between a explicit and an implicit collations is the explicit collation.
> SELECT collation(coalesce(c1 COLLATE UTF8_BINARY, c2))
FROM VALUES('hello',
'world' COLLATE UNICODE) AS T(c1, c2);
UTF8_BINARY
-- The resulting collation between an implicit and the default collation is the implicit collation.
> SELECT collation(coalesce(c1, 'world'))
FROM VALUES('hello' COLLATE UNICODE) AS T(c1, c2);
UNICODE
-- The resulting collation between the default collation and the indeterminate collation is the default collation.
> SELECT collation(coalesce(coalesce('hello' COLLATE UTF8_BINARY, 'world' COLLATE UNICODE), 'world'));
UTF8_BINARY
-- Least common type between GEOGRAPHY(srid) and GEOGRAPHY(ANY)
> SELECT typeof(coalesce(st_geogfromtext('POINT(1 2)'), to_geography('POINT(3 4)'), NULL));
geography(any)
-- Least common type between GEOMETRY(srid1) and GEOMETRY(srid2)
> SELECT typeof(coalesce(st_geomfromtext('POINT(1 2)', 4326), st_geomfromtext('POINT(3 4)', 3857), NULL));
geometry(any)
-- Least common type between GEOMETRY(srid1) and GEOMETRY(ANY)
> SELECT typeof(coalesce(st_geomfromtext('POINT(1 2)', 4326), to_geometry('POINT(3 4)'), NULL));
geometry(any)
Funkcesubstring očekává argumenty typu STRING pro řetězec a INTEGER parametry začátku a délky.
-- 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žňuje implicitní křížové přesměrování na řetězec.
-- 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 lze vyvolat s použitím TIMESTAMP nebo BIGINT díky implicitnímu downcastingu.
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
date_add lze vyvolat pomocí STRINGs kvůli implicitnímu přetypování.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05