Tietokannat – Käytännön PostgreSQL – Type Coercion

Type Coercion

PostgreSQL tukee kolmea erillistä konventiota tyypin coercionille (jota kutsutaan myös nimellä type casting, taiexplisiittinen tyypin valu). Type coercion on hieman ruman näköinen termi, joka viittaaPostgreSQL:n menetelmään muuttaa arvo tietotyypistä toiseen. SQL-lausekkeen keskellä tämä vaikuttaa siten, että luodaan eksplisiittisesti mielivaltaista tyyppiä oleva vakio.

Yleensä mitä tahansa seuraavista kolmesta menetelmästä voidaan käyttää merkkijonovakion sisältämän arvon heittämiseen toiseen tyyppiin:

  • tyyppi ’arvo ’

  • ’arvo ’::tyyppi

  • CAST (’arvo ’ AS tyyppi )

Ylläpidettävien numeeristen vakioiden tapauksessa, jotka halutaan valaa merkkijonoksi, on käytettävä jotakin seuraavistasyntaksimuodoista:

  • arvo ::tyyppi

  • CAST (arvo AS tyyppi )

Tässä syntaksissa arvo edustaa vakiota, jonka tietotyyppiä haluat muuttaa,ja tyyppi edustaa tyyppiä, johon haluat paketoida eli castata arvon.

Huomaa: Muista, että money-tyyppi on deprecated, eikä sitä siksi ole helppo castata.

Vakiot eivät ole ainoita data-arvoja, jotka voidaan pakottaa eri tyyppeihin. SQL-kyselyn palauttaman tietokokonaisuuden sarakkeetvoidaan valaa käyttämällä sen tunnusta jollakin seuraavista syntaksimuodoista:

  • tunniste ::tyyppi

  • CAST (tunniste AS tyyppi )

Kannattaa muistaa, että jokaista datatyyppiä ei voi pakottaa jokaiseen muuhun tietotyyppiin. Esimerkiksi merkkijonoa abcd ei ole mielekästä tapaa muuntaa binääriseksi bittityypiksi. Virheellinen valu johtaa virheilmoitukseen PostgreSQL:ltä. Yleisiä kelvollisia heittoja ovat merkkijonosta, päivämäärä/aika-tyypistä tai numeerisesta tyypistä tekstiksi tai merkkijonosta numeeriseksi arvoksi.

Tyyppien heittokäytäntöjen lisäksi on joitakin funktioita, joita voi kutsua saavuttaakseen olennaisilta osiltaan saman vaikutuksen kuin minkä tahansa aiemmin mainitun muodon eksplisiittinen heitto. Nämä funktiot kantavat usein itse tyypin nimeä (kuten text()-funktio), vaikka toiset on nimetty tarkemmin (kuten bitfromint4()). Esimerkissä 3-30 on tällainen funktio, joka muuntaa kokonaisluvun 1000 merkkijonoksi, joka on tyypiltään text ja edustaa merkkejä 1000.

Esimerkki 3-30. Tyypinmuunnosfunktioiden käyttäminen

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

PostgreSQL:n parserin tunnistamien ristiriitaisten semantiikoiden vuoksi type coercion -muotoa of type ’value ’ voidaan käyttää vain yhden arvon tietotyypin määrittämiseen (esim. merkkijonovakio, joka on sidottu yksinkertaisiin lainausmerkkeihin). Sitä vastoin muita käytettävissä olevia tyyppipakotusmenetelmiä(’value ’::type,CAST(’value’ AS type )ja tyyppimuunnosfunktioita, soveltuvin osin) voidaan käyttää mielivaltaisten lausekkeiden tyypin määrittämiseen.

Tämä johtuu osittain siitä, että jos yritetään seurata tietotyyppiä ryhmitellyllä lausekkeella (esim, suluissa) aiheuttaa sen, että PostgreSQL odottaa funktiota, jolla on annetun tietotyypin nimi (mikä usein aiheuttaa virheen), kun taas kaikki muut menetelmät ovat syntaktisesti päteviä ryhmiteltyjen lausekkeiden yhteydessä.

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)

Vastaa

Sähköpostiosoitettasi ei julkaista.