PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Esiste un modo per eseguire il cast del tipo di dati postgresql 9.3 in modo che possa interessare solo un lato

Ci sono tre tipi di cast. Il cast registrato per la tua origine e un tipo di destinazione deve essere "assegnazione" (a ) o "implicito" (i ) per lavorare nei VALUES espressione di un INSERT dichiarazione. Osservando il catalogo di sistema pg_cast , il cast di boolean a integer è definito solo "esplicito" (e ) :

SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM   pg_cast
WHERE  castsource = 'bool'::regtype
AND    casttarget = 'int'::regtype;

Risultato:

castsource  casttarget  castfunc         castcontext
boolean     integer     pg_catalog.int4  e

Correlati:

Dovresti cambiare castcontext per farlo funzionare, cosa che puoi fare come superutente. Non esiste un'istruzione "ALTER CAST" per questa manovra esotica, dovresti UPDATE direttamente. Come:

UPDATE pg_cast
SET    castcontext = 'a'
WHERE  castsource = 'bool'::regtype
AND    casttarget = 'int'::regtype;

Tuttavia , ci sono buone ragioni per il contesto del cast predefinito di ogni cast. Manomettere i cataloghi di sistema non è qualcosa che dovresti fare alla leggera. In questo caso particolare può sbilanciare il processo decisionale quando Postgres deve scegliere un cast corrispondente. Come per scegliere da un insieme di funzioni sovraccaricate...

Procedura simile per integer -> boolean , int2 -> boolean , boolean -> int2 , ecc.