SQL-adattípus-szabályok

A következőre vonatkozik:check marked yes Databricks SQL check marked yes Databricks Runtime

Az Azure Databricks számos szabályt használ az adattípusok közötti ütközések feloldásához:

Számos típus között explicit módon is átadhatja a öntött elemeket:

Típus-előléptetés

A típus-előléptetés az a folyamat, amely során egy típust egy másik, azonos típusú családba helyeznek, amely az eredeti típus összes lehetséges értékét tartalmazza. Ezért a típus-előléptetés biztonságos művelet. Például TINYINT a tartománya a és -128 a 127között van. Az összes lehetséges érték biztonságosan előléptethető a értékre INTEGER.

Írja be az elsőbbségi listát

A típus elsőbbségi listája határozza meg, hogy egy adott adattípus értékei implicit módon előléptethetők-e egy másik adattípusra.

Adattípus Elsőbbségi lista (a legszűkebbtől a legszélesebbig)
TINYINT TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMÁLIS ->LEBEGŐPONTOS (1) -> DUPLA
SMALLINT SMALLINT -> INT -> BIGINT -> DECIMÁLIS ->LEBEGŐPONTOS (1) -> DUPLA
INT INT –> BIGINT –> DECIMÁLIS –> LEBEGŐPONTOS (1) –> DUPLA
BIGINT BIGINT –> DECIMÁLIS –> LEBEGŐPONTOS (1) –> DUPLA
DECIMÁLIS DECIMÁLIS –> LEBEGŐPONTOS (1) –> DUPLA
ÚSZÓ FLOAT (1) -> DUPLA
DUPLA DOUBLE
DÁTUM DÁTUM –> IDŐBÉLYEG
IDŐBÉLYEG TIMESTAMP
TÖMB TÖMB (2)
BINÁRIS BINARY
LOGIKAI BOOLEAN
INTERVALLUM INTERVALLUM
MEGJELENÍTÉSE TÉRKÉP (2)
KARAKTERLÁNC STRING
STRUCT SZERKEZET (2)

(1) A minimálisan gyakori típusfeloldás esetén a FLOAT ki van hagyva a pontosság elvesztésének elkerülése érdekében.

(2) Összetett típus esetén a prioritási szabály rekurzívan vonatkozik az összetevő elemeire.

Sztringek és NULL

A speciális szabályok vonatkoznak a és a nem begépelt karakterekre STRINGNULL:

  • NULL bármely más típusra előléptethető.
  • STRINGelőléptethető a BIGINT, BINARY, , DATEBOOLEAN, DOUBLE, INTERVALés TIMESTAMP. Ha a tényleges sztringérték nem alakítható át a legkevésbé gyakori típusra , az Azure Databricks futásidejű hibát okoz. A sztringérték előléptetésének INTERVAL meg kell egyeznie az intervallumegységekkel.

Írja be az elsőbbségi gráfot

Ez a prioritási hierarchia grafikus ábrázolása, amely a típus precedencialistáját , sztringeket és NULL-szabályokat kombinálja.

Elsőbbségi szabályok grafikus ábrázolása

Legkevésbé gyakori típusfeloldás

A típuskészletek legkevésbé gyakori típusa a típus elsőbbségi gráfjából elérhető legszűkebb típus a típuskészlet összes eleme számára.

A legkevésbé gyakori típusfeloldás a következő célokra használható:

  • Döntse el, hogy egy adott típusú paraméterre számító függvény meghívható-e egy szűkebb típusú argumentum használatával.
  • Olyan függvény argumentumtípusának származtatása, amely megosztott argumentumtípust vár több paraméterhez, például a következőhöz: coalesce, in, least vagy greatest.
  • Adja meg az operátorok operandusainak típusait, például az aritmetikai műveleteket vagy összehasonlításokat.
  • Származtassa a kifejezés eredménytípusát, például az esetkifejezést.
  • A tömb- és térképkonstruktorok elem-, kulcs- vagy értéktípusainak származtatása.
  • Az UNION, INTERSECT vagy EXCEPT halmaz operátor eredménytípusának származtatása.

A rendszer speciális szabályokat alkalmaz, ha a legkevésbé gyakori típus a következőre FLOAToldható fel: . Ha a hozzájárulási típusok bármelyike pontos numerikus típus (TINYINT, , SMALLINT, INTEGERBIGINTvagy DECIMAL) , akkor a rendszer a legkisebb közös típust küldi DOUBLE el a számjegyek esetleges elvesztésének elkerülése érdekében.

Implicit lecasting és keresztcasting

Az Azure Databricks az implicit casting ezen formáit csak a függvények és operátorok meghívására alkalmazza, és csak akkor, ha egyértelműen meg tudja határozni a szándékot.

  • Implicit lecasting

    Az implicit lecasting automatikusan egy szélesebb típust egy szűkebb típusra vetít anélkül, hogy explicit módon kellene megadnia a leadást. A lecasting kényelmes, de a váratlan futásidejű hibák kockázatát hordozza, ha a tényleges érték nem felel meg a szűk típusnak.

    A downcasting a típus elsőbbségi listáját fordított sorrendben alkalmazza.

  • Implicit keresztcasting

    Az implicit keresztcasting az egyik típuscsaládból a másikba vet egy értéket anélkül, hogy explicit módon kellene megadnia a leadást.

    Az Azure Databricks támogatja az implicit keresztcastingot a következőről:

    • Bármilyen egyszerű típus, kivéve BINARYa , hogy STRING.
    • A STRING bármilyen egyszerű típusra.

Függvényhívások kiosztása

Egy feloldott függvény vagy operátor esetében a következő szabályok vonatkoznak a felsorolt sorrendben az egyes paraméter- és argumentumpárokra:

  • Ha egy támogatott paramétertípus az argumentum típus-elsőbbségi gráfjának része, az Azure Databricks előlépteti az argumentumot erre a paramétertípusra.

    A legtöbb esetben a függvény leírása explicit módon tartalmazza a támogatott típusokat vagy láncokat, például "bármilyen numerikus típust".

    A sin(kifejezés) például a függvényen DOUBLE működik, de bármilyen numerikus függvényt elfogad.

  • Ha a várt paramétertípus egy STRING , és az argumentum egy egyszerű típus, az Azure Databricks keresztküldi az argumentumot a sztring paramétertípusra.

    Például a substr(str, start, len) függvény str várhatóan egy STRINGlesz. Ehelyett megadhat egy numerikus vagy datetime típust.

  • Ha az argumentum típusa egy STRING , és a várt paramétertípus egy egyszerű típus, az Azure Databricks a sztringargumentumot a legszélesebb támogatott paramétertípusra szórja át.

    A date_add(dátum, nap) például egy DATE és egy függvényt INTEGERvár.

    Ha két STRINGs-vel hívja meg a meghívástdate_add(), az Azure Databricks az elsőt STRING az értékreDATE, a másodikat STRING pedig egyre INTEGERkeresztre szórja.

  • Ha a függvény numerikus típust ,- INTEGERra vagy DATE típusra vár, de az argumentum egy általánosabb típus, például egy DOUBLE vagy TIMESTAMP, az Azure Databricks implicit módon erre a paramétertípusra adja vissza az argumentumot.

    Egy date_add (dátum, nap) például egy és egy DATE függvényt INTEGERvár.

    Ha egy és egy TIMESTAMPBIGINTparancsot hív megdate_add(), az Azure Databricks az időösszetevő és a BIGINT érték eltávolításával lekérte a TIMESTAMPDATE értéket egy értékreINTEGER.

  • Ellenkező esetben az Azure Databricks hibát jelez.

Példák

A coalesce függvény minden argumentumtípust elfogad, feltéve, hogy egy legkevésbé gyakori típust használnak.

Az eredménytípus az argumentumok legkevésbé gyakori típusa.

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

Az alsztringfüggvény típus argumentumokat STRING vár a sztringhez, INTEGER valamint az indítási és hosszparaméterekhez.

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

|| (ÖSSZEFŰZ) lehetővé teszi a sztringre történő implicit keresztcastingot.

-- 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 meghívható egy TIMESTAMP vagy BIGINT implicit lecasting miatt.

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

date_add s-vel STRINGhívható meg implicit keresztcasting miatt.

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