Datenbanken – Practical PostgreSQL – Type Coercion

Type Coercion

PostgreSQL unterstützt drei verschiedene Konventionen für Type Coercion (auch Type Casting, oderexplizites Type Casting genannt). Type Coercion ist ein etwas hässlich anmutender Begriff, der sich auf einePostgreSQL-Methode zur Änderung eines Wertes von einem Datentyp in einen anderen bezieht. Mitten in einer SQL-Anweisung hat dies den Effekt, dass explizit eine Konstante eines beliebigen Typs erstellt wird.

Generell kann eine der folgenden drei Methoden verwendet werden, um den in einer String-Konstante enthaltenen Wert in einen anderen Typ zu gießen:

  • Typ ‚Wert‘

  • ‚Wert ‚::Typ

  • CAST (‚Wert ‚ AS Typ )

Im Falle von gepflegten numerischen Konstanten, die Sie in eine Zeichenkette casten wollen, müssen Sie eine der folgenden Syntaxformen verwenden:

  • Wert ::Typ

  • CAST (Wert AS Typ )

Der Wert steht in dieser Syntax für die Konstante, deren Datentyp Sie ändern möchten, und Typ steht für den Typ, in den Sie den Wert zwingen oder casten möchten.

Hinweis: Denken Sie daran, dass der Geldtyp veraltet ist und daher nicht einfach gecastet werden kann.

Konstanten sind nicht die einzigen Datenwerte, die in verschiedene Typen umgewandelt werden können. Spalten eines Datensatzes, der von einer SQL-Abfrage zurückgegeben wird, können durch Verwendung ihres Bezeichners in einer der folgenden Syntaxformen gecastet werden:

  • Bezeichner ::Typ

  • CAST (Bezeichner AS Typ )

Bitte beachten Sie, dass nicht jeder Datentyp in jeden anderen Datentyp gecastet werden kann. Zum Beispiel gibt es keine sinnvolle Möglichkeit, die Zeichenkette abcd in einen binären Bittyp zu konvertieren. Ungültiges Casting führt zu einer Fehlermeldung vonPostgreSQL. Gängige gültige Casts sind von Zeichenketten, Datums-/Zeittypen oder einem numerischen Typ in Text oder Zeichenketten in numerische Werte.

Zusätzlich zu diesen Typ-Casting-Konventionen gibt es einige Funktionen, die aufgerufen werden können, um im Wesentlichen den gleichen Effekt zu erzielen wie ein expliziter Cast einer der zuvor genannten Formen. Diese tragen oft den Namen des Typs selbst (z. B. die Funktion text()), während andere spezifischer benannt sind (z. B. bitfromint4()). Beispiel 3-30 zeigt eine solche Funktion, die die Ganzzahl 1000 in eine Zeichenkette vom TypText konvertiert, die die Zeichen 1000 darstellt.

Beispiel 3-30. Verwenden von Typkonvertierungsfunktionen

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

Aufgrund der widersprüchlichen Semantik, die vom PostgreSQL-Parser erkannt wird, kann das Typ-Zwangsformat des Typs ‚value ‚ nur verwendet werden, um den Datentyp eines einzelnen Wertes anzugeben (z.B. eine String-Konstante, die durch einfache Anführungszeichen begrenzt ist). Im Gegensatz dazu können die anderen verfügbaren Methoden der Typumwandlung (‚value ‚::type,CAST(‚value‘ AS type )und Typumwandlungsfunktionen, wo anwendbar) verwendet werden, um den Typ beliebiger Ausdrücke anzugeben.

Das liegt zum Teil daran, dass der Versuch, einem Datentyp mit einem gruppierten Ausdruck zu folgen (z.B., in Klammern) dazu führt, dass PostgreSQL eine Funktion mit dem Namen des angegebenen Datentyps erwartet (was oft zu einem Fehler führt), während jede der anderen Methoden bei gruppierten Ausdrücken syntaktisch gültig ist.

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)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.