Er zijn drie soorten cast. De geregistreerde cast voor uw bron en een doeltype moet "toewijzing" zijn (a ) of "impliciet" (i ) om te werken in de VALUES uitdrukking van een INSERT uitspraak. Kijkend naar de systeemcatalogus pg_cast
, de cast van boolean naar integer is alleen gedefinieerd "expliciet" (e ) :
SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM pg_cast
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Resultaat:
castsource casttarget castfunc castcontext
boolean integer pg_catalog.int4 e
Gerelateerd:
Je zou castcontext . moeten veranderen om het te laten werken - wat u kunt doen als supergebruiker. Er is geen "ALTER CAST"-statement voor deze exotische manoeuvre, je zou moeten UPDATE direct. Vind ik leuk:
UPDATE pg_cast
SET castcontext = 'a'
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Echter , zijn er goede redenen voor de vooraf gedefinieerde cast-context van elke cast. Knoeien met systeemcatalogi is niet iets dat u lichtvaardig moet doen. In dit specifieke geval kan het de besluitvorming uit balans brengen wanneer Postgres een bijpassende cast moet kiezen. Zoals kiezen uit een reeks overbelaste functies ...
Vergelijkbare procedure voor integer -> boolean , int2 -> boolean , boolean -> int2 , enz.