2009-11-16 30 views
35

Ho un campo che è INTEGER NOT NULL DEFAULT 0 e ho bisogno di cambiarlo in bool.Postgres Alter Column Integer to Boolean

Questo è quello che sto usando:

ALTER TABLE mytabe 
ALTER mycolumn TYPE bool 
USING 
    CASE 
     WHEN 0 THEN FALSE 
     ELSE TRUE 
    END; 

Ma io sono sempre:

ERROR: argument of CASE/WHEN must be type boolean, not type integer 

********** Error ********** 

ERROR: argument of CASE/WHEN must be type boolean, not type integer 
SQL state: 42804 

Qualche idea?

Grazie.

risposta

67

Prova questa:

ALTER TABLE mytabe ALTER COLUMN mycolumn DROP DEFAULT; 
ALTER TABLE mytabe ALTER mycolumn TYPE bool USING CASE WHEN mycolumn=0 THEN FALSE ELSE TRUE END; 
ALTER TABLE mytabe ALTER COLUMN mycolumn SET DEFAULT FALSE; 

è necessario rimuovere il vincolo prima (come la sua non un valore booleano), e in secondo luogo la sua dichiarazione era CASE sintatticamente sbagliato.

7

Sopra risposta è corretta che mi ha aiutato solo una modifica, invece di caso ho usato il casting di tipo

ALTER TABLE mytabe ALTER COLUMN mycolumn DROP DEFAULT; 
ALTER TABLE mytabe ALTER mycolumn TYPE bool USING mycolumn::boolean; 
ALTER TABLE mytabe ALTER COLUMN mycolumn SET DEFAULT FALSE; 
+0

la risposta accettata è meglio perché * non * fare affidamento su tipo-casting. Ad esempio, questo metodo fallisce con "impossibile eseguire il cast di tipo smallint su boolean". –