web-dev-qa-db-fra.com

Comment changer le type de données de la colonne de caractère en numérique dans PostgreSQL 8.4

J'utilise la requête suivante:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 

changer le type de données d'une colonne de character(20) à numeric(10,0) mais j'obtiens l'erreur suivante:

la colonne "code" ne peut pas être convertie en type numérique

126
user728630

Vous pouvez essayer d'utiliser USING :

La clause optionnelle USING spécifie comment calculer la nouvelle valeur de colonne à partir de l'ancienne; Si elle est omise, la conversion par défaut est identique à celle d'une affectation d'un type de données ancien à un nouveau. Une clause USING doit être fournie s'il n'y a pas de conversion implicite ou d'affectation de l'ancien au nouveau type.

Donc, cela pourrait fonctionner (en fonction de vos données):

alter table presales alter column code type numeric(10,0) using code::numeric;
-- Or if you prefer standard casting...
alter table presales alter column code type numeric(10,0) using cast(code as numeric);

Cela échouera si vous avez quelque chose dans code qui ne peut pas être converti en numérique; Si l'utilisation échoue, vous devrez nettoyer les données non numériques à la main avant de changer le type de colonne.

223
mu is too short

Si votre colonne VARCHAR contient des chaînes vides (qui sont pas identiques à NULL pour PostgreSQL, vous vous en souviendrez peut-être), vous devez utiliser quelque chose dans la ligne suivante pour définir une valeur par défaut:

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);

(trouvé avec l'aide de cette réponse )

6
Patru