Databases – Praktisch PostgreSQL – Type Coercion

Type Coercion

PostgreSQL ondersteunt drie verschillende conventies voor type coercion (ook wel type casting, orexplicit type casting genoemd). Type coercion is een wat lelijk aandoende term die verwijst naar eenPostgreSQL methode om een waarde van het ene gegevenstype in een ander te veranderen. In het midden van een SQL-instructie heeft dit het netto effect van het expliciet creëren van een constante van een willekeurig type.

In het algemeen kan een van de volgende drie methoden worden gebruikt om de waarde in een stringconstante te casten naar een ander type:

  • type ‘waarde ‘

  • ‘waarde ‘::type

  • CAST (‘waarde ‘ AS type )

In het geval van gehandhaafde numerieke constanten die u wilt casten naar een tekenreeks, moet u een van de volgende syntaxisvormen gebruiken:

  • value ::type

  • CAST (value AS type )

De value in deze syntaxis vertegenwoordigt de constante waarvan u het gegevenstype wilt wijzigen, en type vertegenwoordigt het type waarin u de waarde wilt coercen, oftewel gieten.

Opmerking: denk eraan dat het type geld is afgeschreven en daarom niet gemakkelijk kan worden gecast.

Constanten zijn niet de enige gegevenswaarden die naar verschillende typen kunnen worden geforceerd. Kolommen van een gegevensverzameling die door een SQL-query zijn geretourneerd, kunnen worden gecast door de identifier ervan in een van de volgende syntaxisvormen te gebruiken:

  • identifier ::type

  • CAST (identifier AS type )

Bedenk dat niet elk gegevenstype in elk ander gegevenstype kan worden gecoërcet. Er is bijvoorbeeld geen zinvolle manier om de tekenreeks abcd om te zetten in een binair bit-type. Ongeldige casting zal resulteren in een foutmelding vanPostgreSQL. Veel voorkomende geldige casts zijn van karakter string, datum/tijd type, of een numeriek type naar tekst, of karakter strings naar numerieke waarden.

Naast deze type casting conventies, zijn er een aantal functies die kunnen worden aangeroepen om in wezen hetzelfde effect te bereiken als een expliciete cast van een van de eerder genoemde vormen. Deze dragen vaak de naam van het type zelf (zoals de text() functie), hoewel andere specifieker genoemd zijn (zoals bitfromint4()). Voorbeeld 3-30 toont zo’n functie, die het gehele getal 1000 omzet in een tekenreeks van het type tekst die de tekens 1000 weergeeft.

Voorbeeld 3-30. Type Conversion Functions

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

Omwille van tegenstrijdige semantiek die door PostgreSQL’s parser wordt herkend, kan het type coercion format van het type ‘value ‘ alleen worden gebruikt om het datatype van een enkele waarde te specificeren (b.v. een string constante tussen enkele aanhalingstekens). Daarentegen kunnen de andere beschikbare methoden van type-coercion (‘value ‘::type,CAST(‘value’ AS type )en type-conversiefuncties, waar van toepassing) worden gebruikt om het type van willekeurige expressies op te geven.

Dit komt gedeeltelijk doordat een poging om een gegevenstype te volgen met een gegroepeerde expressie (bijv, tussen haakjes) PostgreSQL een functie verwacht met de naam van het gegeven datatype (wat vaak een fout zal veroorzaken), terwijl elk van de andere methoden syntactisch geldig is bij gegroepeerde expressies.

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)

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.