Databáze – Praktická PostgreSQL – Type Coercion

Type Coercion

PostgreSQL podporuje tři samostatné konvence pro type coercion (nazývané také type casting, nebo explicit type casting). Type coercion je poněkud ošklivě vypadající termín, který označuje metoduPostgreSQL pro změnu hodnoty z jednoho datového typu na jiný. Uprostřed příkazu SQL to má čistý účinek explicitního vytvoření konstanty libovolného typu.

Všeobecně lze k převedení hodnoty obsažené v řetězcové konstantě na jiný typ použít některou z následujících tří metod:

  • type ‚value ‚

  • ‚value ‚::type

  • CAST (‚value ‚ AS type )

V případě udržovaných číselných konstant, které chcete převést na řetězec znaků, budete muset použít jeden z následujícíchsyntaktických tvarů:

  • hodnota ::typ

  • CAST (hodnota JAKO typ )

Hodnota v této syntaxi představuje konstantu, jejíž datový typ si přejete upravit, a typ představuje typ, do kterého si přejete hodnotu vnutit neboli castovat.

Poznámka: Nezapomeňte, že typ money je zastaralý, a proto jej nelze snadno castovat.

Konstanty nejsou jediné datové hodnoty, které lze coercedovat na různé typy. Sloupce datové množiny vrácené dotazem SQLmůžete obsadit pomocí jejího identifikátoru v jednom z následujících syntaktických tvarů:

  • identifikátor ::typ

  • CAST (identifikátor AS typ )

Mějte na paměti, že ne každý datový typ lze obsadit do každého jiného datového typu. Například neexistuje žádný smysluplný způsob, jak převést znakový řetězec abcd na binární bitový typ. Nesprávné převedení bude mít za následek chybuPostgreSQL. Obvyklá platná obsazení jsou ze znakového řetězce, typu datum/čas nebo číselného typu na text nebo ze znakových řetězců na číselné hodnoty.

Kromě těchto konvencí pro obsazování typů existují některé funkce, které lze volat, aby se dosáhlo v podstatě stejného efektu jako explicitní obsazení některého z dříve uvedených tvarů. Ty často nesou jméno samotného typu (například funkce text()), jiné jsou však pojmenovány konkrétněji(například bitfromint4()). Příklad 3-30 ukazuje takovou funkci, která převádí celé číslo 1000 na řetězec znaků typutext reprezentující znaky 1000.

Příklad 3-30. Použití funkcí pro převod typů

booktown=# SELECT text(1000) booktown-# AS explicit_text; explicit_text--------------- 1000(1 row)

Vzhledem ke konfliktní sémantice rozpoznané parserem PostgreSQL lze formát pro převod typů typu ‚value ‚ použít pouze k určení datového typu jedné hodnoty (např. řetězcové konstanty ohraničené jednoduchými uvozovkami). Naproti tomu ostatní dostupné metody type coercion (‚value ‚::type,CAST(‚value‘ AS type )a případné funkce pro konverzi typů) lze použít k určení typu libovolných výrazů.

Částečně je to proto, že pokus o sledování datového typu pomocí seskupeného výrazu (např, v závorkách) způsobí, že PostgreSQL bude očekávat funkci s názvem zadaného datového typu (což často způsobí chybu), zatímco každá z ostatních metod je při seskupených výrazech syntakticky platná.

booktown=# SELECT 1 + integer ('1' || '2') AS add_one_to_twelve;ERROR: Function 'integer(text)' does not exist Unable to identify a function that satisfies the given argument types You may need to add explicit typecastsbooktown=# SELECT 1 + ('1' || '2')::integer AS add_one_to_twelve; add_one_to_twelve------------------- 13(1 row)booktown=# SELECT 1 + CAST('1' || '2' AS integer) AS add_on_to_twelve; add_on_to_twelve------------------ 13(1 row)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.