Adatbázisok – Gyakorlati PostgreSQL – Type Coercion
Type Coercion
A PostgreSQL három különböző konvenciót támogat a type coercionra (más néven type casting, vagyexplicit type casting). A type coercion egy kissé csúnyának tűnő kifejezés, amely egyPostgreSQL módszerre utal, amellyel egy értéket egyik adattípusból egy másikba lehet átváltani. Egy SQL utasítás közepén ennek az a hatása, hogy explicit módon létrehoz egy tetszőleges típusú konstanst.
Általában a következő három módszer bármelyike használható egy stringkonstansban lévő érték más típusba való átvitelére:
-
típus ‘érték ‘
-
‘érték ‘::típus
-
CAST (‘érték ‘ AS típus )
A karbantartott numerikus konstansok esetében, amelyeket karakterláncba szeretnénk átkonvertálni, az alábbi szintaxisformák egyikét kell használnunk:
-
érték ::típus
-
CAST (érték AS típus )
Az érték ebben a szintaxisban azt a konstansot jelöli, amelynek adattípusát módosítani kívánja,a típus pedig azt a típust, amelyre az értéket kényszeríteni, vagy átkonvertálni kívánja.
Figyelem: Ne feledje, hogy a money típus deprecated, és ezért nem könnyen castolható.
A konstansok nem az egyetlen adatértékek, amelyek különböző típusokra kényszeríthetők. Egy SQL-lekérdezés által visszaadott adathalmaz oszlopaiaz azonosítójának felhasználásával az alábbi szintaxisformák valamelyikével kasztolhatók:
-
azonosító ::típus
-
CAST (azonosító AS típus )
Ne feledjük, hogy nem minden adattípus kényszeríthető minden más adattípusba. Például nincs értelmes módja annak, hogy az abcd karakterláncot bináris bittípussá alakítsuk. Az érvénytelen öntés hibát eredményez aPostgreSQL részéről. A leggyakoribb érvényes castingok a karakterláncból, dátum/idő típusból vagy numerikus típusból szöveggé, vagy karakterláncból numerikus értékké.
A típuscastolási konvenciók mellett vannak olyan függvények, amelyek meghívásával lényegében ugyanazt a hatást lehet elérni, mint a korábban említett formák bármelyikének explicit castolásával. Ezek gyakran magának a típustípusnak a nevét viselik (mint például a text() függvény), bár mások pontosabban vannak megnevezve (mint például a bitfromint4()). A 3-30. példa egy ilyen függvényt mutat, amely az 1000 egész számot az 1000 karaktereket reprezentáló typetext karakterlánccá alakítja.
3-30. példa. Típuskonverziós függvények használata
booktown=# SELECT text(1000) booktown-# AS explicit_text; explicit_text--------------- 1000(1 row)
A PostgreSQL elemzője által felismert ellentmondásos szemantika miatt a type coercion format of type ‘value ‘ csak egyetlen érték adattípusának megadására használható (pl. egy szimpla idézőjelek közé kötött string konstans). Ezzel szemben a type coercion többi rendelkezésre álló módszere(‘value ‘::type,CAST(‘value’ AS type )és a type conversion függvények, ahol alkalmazható) tetszőleges kifejezések típusának megadására használható.
Ez részben azért van, mert ha egy adattípust csoportosított kifejezéssel próbálunk követni (pl., zárójelben) a PostgreSQL a megadott adattípus nevével rendelkező függvényt vár (ami gyakran hibát okoz), míg a többi módszer mindegyike szintaktikailag érvényes a csoportosított kifejezésekre.
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)