Es gibt drei Arten von Besetzungen. Die registrierte Umwandlung für Ihren Quell- und Zieltyp muss "Zuweisung" (a sein ) oder "implizit" (i ) um in den VALUES zu arbeiten Ausdruck eines INSERT Aussage. Betrachten Sie den Systemkatalog pg_cast
, die Umwandlung von boolean zu integer ist nur "explizit" definiert (e ) :
SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM pg_cast
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Ergebnis:
castsource casttarget castfunc castcontext
boolean integer pg_catalog.int4 e
Verwandte:
Sie müssten castcontext ändern damit es funktioniert - was Sie können als Superuser tun. Für dieses exotische Manöver gibt es keine "ALTER CAST"-Anweisung, Sie müssten UPDATE direkt. Wie:
UPDATE pg_cast
SET castcontext = 'a'
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Allerdings , gibt es gute Gründe für den vordefinierten Cast-Kontext jedes Casts. Das Manipulieren von Systemkatalogen sollten Sie nicht auf die leichte Schulter nehmen. In diesem speziellen Fall kann es die Entscheidungsfindung aus dem Gleichgewicht bringen, wenn Postgres eine passende Besetzung auswählen muss. Wie zum Auswählen aus einer Menge überladener Funktionen ...
Ähnliches Verfahren für integer -> boolean , int2 -> boolean , boolean -> int2 usw.