CREATE CAST

Name

CREATE CAST -- definiert eine neue Typumwandlung

Synopsis

CREATE CAST (quelltyp AS zieltyp)
    WITH FUNCTION funktionsname (argtyp)
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (quelltyp AS zieltyp)
    WITHOUT FUNCTION
    [ AS ASSIGNMENT | AS IMPLICIT ]

Beschreibung

CREATE CAST definiert eine neue Typumwandlung (englisch cast). Eine Typumwandlung gibt an, wie ein Wert von einem Datentyp in einen anderen umgewandelt werden kann. Zum Beispiel:

SELECT CAST(42 AS text);

Dieser Ausdruck wandelt die Konstante 42 vom Typ integer in den Typ text um, indem er eine vorher angegebene Funktion aufruft, in diesem Fall text(int4). (Wenn keine passende Typumwandlung definiert wurde, dann schlägt die Umwandlung fehl.)

Zwei Typen können binärkompatibel sein, was heißt, dass sie ohne eine Funktion aufzurufen ineinander umgewandelt werden können. Das erfordert, dass zwei einander entsprechende Werte das selbe interne Format haben müssen. Zum Beispiel sind die Typen text und varchar binärkompatibel.

Wenn nichts anderes angegeben ist, dann wird eine Typumwandlung nur bei ausdrücklicher Anforderung angewendet, das heißt durch CAST(x AS typname), x::typname oder typname(x).

Wenn eine Typumwandlung mit AS ASSIGNMENT markiert wurde, dann kann sie implizit angewendet werden, wenn ein Wert einer Spalte mit dem Zieldatentyp zugewiesen wird. Wenn zum Beispiel die Spalte foo.f1 den Datentyp text hat, dann wird

INSERT INTO foo (f1) VALUES (42);

funktionieren, wenn die Typumwandlung vom Typ integer in den Typ text mit AS ASSIGNMENT markiert wurde, ansonsten nicht.

Wenn eine Typumwandlung mit AS IMPLICIT markiert wurde, dann kann sie implizit in jedem Zusammenhang verwendet werden, egal ob bei einer Wertzuweisung oder in einem Ausdruck. Zum Beispiel hat der Operator || zwei Operanden vom Typ text. Daher wird

SELECT 'Die Zeit ist ' || now();

nur funktionieren, wenn die Typumwandlung vom Typ timestamp in den Typ text mit AS IMPLICIT markiert wurde. Ansonsten müsste man die Typumwandlung ausdrücklich anfordern, zum Beispiel so:

SELECT 'Die Zeit ist ' || CAST(now() AS text);

Implizite Typumwandlungen sollte man nur mit Vorsicht erzeugen. Bei zu vielen impliziten Typumwandlungspfaden kann PostgreSQL Befehle auf überraschende Weise interpretieren oder Befehle gar nicht auflösen, weil es zu viele mögliche Interpretationen gibt. Eine gute Richtlinie ist, dass man nur Typumwandlungen implizit machen sollten, die zwischen Typen der selben allgemeinen Kategorie umwandeln und alle Informationen erhalten. Zum Beispiel kann eine Umwandlung von int2 in int4 ohne Probleme implizit sein, aber die Umwandlung von float8 in int4 sollte wahrscheinlich nur bei Wertzuweisungen zugelassen werden. Typumwandlungen zwischen Typen verschiedener Kategorien, wie von text in int4, sollten am besten nur bei ausdrücklicher Anforderung getätigt werden.

Um eine Typumwandlung erzeugen zu können müssen die den Quell- oder den Zieldatentyp besitzen. Um eine binärkompatible Typumwandlung zu erzeugen müssen Sie ein Superuser sein. (Diese Einschränkung besteht, weil eine fehlerhafte binärkompatible Typumwandlung ziemlich einfach den Server zum Absturz bringen kann.)

Parameter

quelltyp

Der Name des Quelldatentyps der Typumwandlung.

zieltyp

Der Name des Zieldatentyps der Typumwandlung.

funktionsname(argtyp)

Die Funktion, mit der die Umwandlung durchgeführt werden soll. Der Funktionsname kann eine Schemaqualifikation haben. Wenn nicht, dann wird die Funktion im Pfad gesucht werden. Der Argumentdatentyp muss mit dem Quelldatentyp identisch sein, der Rückgabedatentyp muss mit dem Zieldatentyp der Typumwandlung übereinstimmen. sein.

WITHOUT FUNCTION

Gibt an, dass der Quelldatentyp und der Zieldatentyp binärkompatibel sind, so dass keine Funktion für die Durchführung der Umwandlung benötigt wird.

AS ASSIGNMENT

Gibt an, dass die Umwandlung im Zusammenhang mit einer Wertzuweisung angewendet werden darf.

AS IMPLICIT

Gibt an, dass die Umwandlung in jedem Zusammenhang implizit angewendet werden kann.

Meldungen

CREATE CAST

Meldung, wenn die Typumwandlung erfolgreich erzeugt wurde.

Hinweise

Denken Sie daran, wenn Sie Typen in beide Richtungen umwandeln wollen, dann müssen Sie Typumwandlungen für beide Richtungen ausdrücklich deklarieren.

Vor PostgreSQL 7.3 war jede Funktion, die den gleichen Namen wie ein Datentyp hatte, diesen Datentyp zurückgab und ein Argument von einem anderen Datentyp hatte, automatisch eine Typumwandlungsfunktion. Diese Konvention wurde abgeschafft wegen der Einführung von Schemas und um binärkompatible Umwandlungen in den Systemkatalogen darstellen zu können. (Die eingebauten Umwandlungsfunktionen folgen nach wie vor diesem Namensschema, aber sie müssen jetzt im Systemkatalog pg_cast als Umwandlungsfunktionen angegeben werden.)

Beispiele

Um eine Typumwandlung vom Typ text in den Typ int4 mit der Funktion int4(text) zu definieren:

CREATE CAST (text AS int4) WITH FUNCTION int4(text);

(Diese Umwandlung ist schon im System vordefiniert.)

Kompatibilität

Der Befehl CREATE CAST ist konform mit dem SQL-Standard, außer dass der Standard keine Bestimmungen für binärkompatible Typen macht. Die Klausel AS IMPLICIT ist ebenfalls eine PostgreSQL-Erweiterung.

Siehe Auch

CREATE FUNCTION, CREATE TYPE, DROP CAST