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
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 clauseUSING
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.
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 )