2009-11-16 90 views
35

Tengo un campo INTEGER NOT NULL DEFAULT 0 y necesito cambiarlo a bool.Postgres Alter Column Entero a booleano

Esto es lo que estoy utilizando:

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

Pero me estoy:

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 

Alguna idea?

Gracias.

Respuesta

67

Prueba esto:

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; 

Es necesario eliminar la restricción en primer lugar (ya que no es un valor lógico), y en segundo lugar su estado de CASE era sintácticamente mal.

7

encima respuesta correcta es que me ayudó Sólo una modificación en lugar de caso he usado la conversión de tipos

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 respuesta aceptada es mejor, ya que * no * se basan en el tipo de fundición. Este método falla con 'can not cast type smallint to boolean', por ejemplo. –