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.