Databaser – Praktisk PostgreSQL – Type Coercion

Type Coercion

PostgreSQL understøtter tre separate konventioner for type coercion (også kaldet type casting eller eksplicit type casting). Type coercion er et lidt grimt udseende udtryk, som henviser til enPostgreSQL -metode til at ændre en værdi fra en datatype til en anden. Midt i en SQL-angivelse har dette den nettoeffekt at der eksplicit oprettes en konstant af en vilkårlig type.

Generelt kan en af de følgende tre metoder bruges til at kaste værdien indeholdt i en strengkonstant til en anden type:

  • type ‘value’

  • ‘value ‘::type

  • CAST (‘value ‘ AS type )

For vedligeholdte numeriske konstanter, som du ønsker at caste til en tegnstreng, skal du bruge en af de følgende syntaksformer:

  • værdi ::type

  • CAST (value AS type )

Værdien i denne syntaks repræsenterer den konstant, hvis datatype du ønsker at ændre, og type repræsenterer den type, som du ønsker at tvinge, eller caster, værdien til.

Bemærk: Husk, at typen money er deprecated og derfor ikke let castet.

Konstanter er ikke de eneste dataværdier, der kan coercedes til forskellige typer. Kolonner i et datasæt, der returneres af en SQL-forespørgsel, kan castes ved at bruge dets identifikator i en af følgende syntaksformer:

  • identifikator ::type

  • CAST (identifier AS type )

Husk, at ikke alle datatyper kan coercedes til alle andre datatyper. Der er f.eks. ingen meningsfuld måde at konverteretegnstrengen abcd til en binær bit-type på. Ugyldig casting vil resultere i en fejl fraPostgreSQL. Almindelige gyldige casts er fra tegnstrenge, dato/tidstype eller en numerisk type til tekst eller tegnstrenge til numeriske værdier.

Ud over disse type casting-konventioner er der nogle funktioner, der kan kaldes for at opnå stort set den samme effekt som en eksplicit cast af en af de tidligere nævnte former. Disse funktioner bærer ofte navnet på selve typen (f.eks. funktionen text()), selv om andre er navngivet mere specifikt (f.eks. bitfromint4()). Eksempel 3-30 viser en sådan funktion, der konverterer det hele tal 1000 til en tegnstreng af typetext, der repræsenterer tegnene 1000.

Eksempel 3-30. Brug af typekonverteringsfunktioner

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

På grund af den modstridende semantik, som PostgreSQL’s parser genkender, kan type coercion-formatet af typen ‘value ‘ kun bruges til at angive datatypen for en enkelt værdi (f.eks. en strengkonstant, der er afgrænset af enkelte anførselstegn). I modsætning hertil kan de andre tilgængelige metoder til type coercion(‘value ‘::type,CAST(‘value’ AS type )og typekonverteringsfunktioner, hvor det er relevant) bruges til at angive typen af vilkårlige udtryk.

Dette skyldes til dels, at forsøg på at følge en datatype med et grupperet udtryk (f.eks, i parenteser) vil få PostgreSQL til at forvente en funktion med navnet på den angivne datatype (hvilket ofte vil forårsage en fejl), mens hver af de andre metoder er syntaktisk gyldige ved grupperede udtryk.

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)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.