Sdílet prostřednictvím


Pravidla datových typů SQL

Platí pro:označeno jako ano Databricks SQL označeno jako ano Databricks Runtime

Azure Databricks používá k řešení konfliktů mezi datovými typy několik pravidel:

Můžete také explicitně přetypovat mezi mnoha typy:

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:

  • NULL lze povýšit na jakýkoli jiný typ.
  • STRINGmohou být povýšeny na BIGINT, , BINARY, BOOLEANDATE, DOUBLE, , INTERVALa TIMESTAMP. 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í na INTERVAL se 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 .

Grafické znázornění pravidel priority

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í. GEOGRAPHY a GEOMETRY datové 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, GEOGRAPHYa GEOMETRY, do STRING.
    • A STRING na jakýkoli jednoduchý typ, s výjimkou GEOGRAPHY a GEOMETRY.

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 STRING a argument je jednoduchý typ, Azure Databricks upraví argument na typ parametru řetězce.

    Například substr(str, start, délka) očekává, že str bude STRING. Místo toho můžete předat číselný nebo typ data a času.

  • Pokud je typ argumentu STRING a 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á DATE a INTEGER.

    Pokud zavoláte date_add() se dvěma STRING, Azure Databricks převede první STRING na DATE a druhý STRING na INTEGER.

  • Pokud funkce očekává číselný typ, například typ INTEGER, nebo typ DATE, ale argument je obecnější typ, například DOUBLE nebo TIMESTAMP, Azure Databricks implicitně přetypovává argument na tento typ parametru.

    Například date_add(datum, dny) očekává DATE a INTEGER.

    Pokud vyvoláte date_add() s TIMESTAMP a BIGINT, Azure Databricks přetypovává TIMESTAMP na DATE odebráním časové komponenty a BIGINT na INTEGER.

  • 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