Databaser – Praktisk PostgreSQL – Type Coercion

Type Coercion

PostgreSQL har stöd för tre separata konventioner för type coercion (även kallad type casting eller explicit type casting). Type coercion är en något ful term som hänvisar till enPostgreSQL -metod för att ändra ett värde från en datatyp till en annan. I mitten av ett SQL-statement har detta nettoeffekten av att explicit skapa en konstant av en godtycklig typ.

I allmänhet kan någon av följande tre metoder användas för att casta värdet som finns i en strängkonstant till en annan typ:

  • typ ’value ’

  • ’value ’::type

  • CAST (’value ’ AS type )

För underhållna numeriska konstanter som du vill casta till en teckensträng måste du använda en av följande syntaxformer:

  • värde ::typ

  • CAST (value AS type )

Värdet i den här syntaxen representerar den konstant vars datatyp du vill ändra, och typ representerar den typ som du vill tvinga, eller casta, värdet till.

Notera: Kom ihåg att typen money är deprecated och därför inte är lätt att casta.

Konstanter är inte de enda datavärden som kan tvingas till olika typer. Kolumner i en datamängd som returneras av en SQL-fråga kan kastas genom att använda dess identifier i en av följande syntaxformer:

  • identifier ::type

  • CAST (identifier AS type )

Håll i minnet att inte alla datatyper kan tvingas till alla andra datatyper. Det finns till exempel inget meningsfullt sätt att omvandla teckensträngen abcd till en binär bityp. Ogiltig gjutning kommer att resultera i ett fel frånPostgreSQL. Vanliga giltiga casts är från teckensträng, datum/tidstyp eller en numerisk typ till text, eller teckensträngar till numeriska värden.

Inom dessa konventioner för typcasting finns det några funktioner som kan anropas för att uppnå i stort sett samma effekt som en explicit cast av någon av de tidigare nämnda formerna. Dessa har ofta namnet på själva typen (t.ex. funktionen text()), men andra har ett mer specifikt namn (t.ex. bitfromint4()). Exempel 3-30 visar en sådan funktion som omvandlar heltalet 1000 till en teckensträng av typentext som representerar tecknen 1000.

Exempel 3-30. Användning av typkonverteringsfunktioner

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

På grund av den motstridiga semantik som PostgreSQL:s parser känner igen, kan typkonverteringsformatet type ’value ’ endast användas för att ange datatypen för ett enda värde (t.ex. en strängkonstant som är avgränsad av enkla citattecken). Däremot kan de andra tillgängliga metoderna för type coercion(’value ’::type,CAST(’value’ AS type )och typkonverteringsfunktioner, där det är tillämpligt) användas för att specificera typen av godtyckliga uttryck.

Detta beror delvis på att om man försöker följa en datatyp med ett grupperat uttryck (t.ex, inom parentes) gör att PostgreSQL förväntar sig en funktion med namnet på den tillhandahållna datatypen (vilket ofta orsakar ett fel), medan alla andra metoder är syntaktiskt giltiga vid grupperade uttryck.

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)

Lämna ett svar

Din e-postadress kommer inte publiceras.