Baze de date – PostgreSQL practic – Coerciția tipurilor

Coerciția tipurilor

PostgreSQL suportă trei convenții distincte pentru coerciția tipurilor (numită și turnare de tip, sau turnare explicită de tip). Coerciția de tip este un termen cu aspect oarecum urât care se referă la o metodăPostgreSQL de schimbare a unei valori dintr-un tip de date în altul. În mijlocul unei instrucțiuni SQL, acest lucru are ca efect net crearea explicită a unei constante de un tip arbitrar.

În general, oricare dintre următoarele trei metode poate fi utilizată pentru a transforma valoarea conținută într-o constantă de șir de caractere într-un alt tip:

  • type ‘value ‘

  • ‘value ‘::type

  • CAST (‘value ‘ AS type )

În cazul constantelor numerice întreținute pe care doriți să le transformați într-un șir de caractere, va trebui să utilizați una dintre următoarele forme de sintaxă:

  • value ::type

  • CAST (value AS type )

În această sintaxă, value reprezintă constanta al cărei tip de date doriți să îl modificați, iar type reprezintă tipul în care doriți să forțați, sau să transformați valoarea.

Rețineți: Rețineți că tipul money este depreciat și, prin urmare, nu este ușor de distribuit.

Constantele nu sunt singurele valori de date care pot fi constrânse în tipuri diferite. Coloanele unui set de date returnate de o interogare SQLpot fi turnate prin utilizarea identificatorului său într-una din următoarele forme de sintaxă:

  • identificator ::tip

  • CAST (identifier AS type )

Atenție, nu orice tip de date poate fi corelat în orice alt tip de date. De exemplu, nu există o modalitate semnificativă de a converti șirul de caractere abcd într-un tip de bit binar. Castingul nevalabil va duce la o eroare din parteaPostgreSQL. Castingurile valide obișnuite sunt de la un șir de caractere, de la un tip de dată/timp sau de la un tip numeric la text, sau de la șiruri de caractere la valori numerice.

În plus față de aceste convenții de turnare a tipurilor, există unele funcții care pot fi apelate pentru a obține practic același efect ca un cast explicit al oricăreia dintre formele menționate anterior. Acestea poartă adesea numele tipului însuși (cum ar fi funcția text()), deși altele sunt numite mai specific (cum ar fi bitfromint4()). Exemplul 3-30 prezintă o astfel de funcție, care convertește numărul întreg 1000 într-un șir de caractere de tiptext reprezentând caracterele 1000.

Exemplu 3-30. Utilizarea funcțiilor de conversie a tipurilor

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

Din cauza semanticii conflictuale recunoscute de parserul PostgreSQL, formatul de coerciție a tipului ‘valoare ‘ poate fi utilizat numai pentru a specifica tipul de date al unei singure valori (de exemplu, o constantă de șir de caractere delimitată de ghilimele simple). În schimb, celelalte metode disponibile de coerciție de tip (‘valoare ‘::tip,CAST(‘valoare’ AS tip )și funcțiile de conversie de tip, acolo unde este cazul) pot fi folosite pentru a specifica tipul unor expresii arbitrare.

Acest lucru se datorează parțial faptului că încercarea de a urmări un tip de date cu o expresie grupată (de ex, în paranteze) va face ca PostgreSQL să se aștepte la o funcție cu numele tipului de date furnizat (ceea ce va cauza adesea o eroare), în timp ce fiecare dintre celelalte metode sunt valide din punct de vedere sintactic în cazul expresiilor grupate.

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)

>.

Lasă un răspuns

Adresa ta de email nu va fi publicată.