Dupliquer possible:
Comment changer le type de données de la colonne de caractère en numérique dans postgresql 8.4
Si j'ai un champ de type varchar (et que toutes les valeurs sont des représentations null ou string de nombres), comment utiliser alter table pour convertir ce type de colonne en bigint?
Pour convertir simplement en analysant la chaîne (casting):
alter table the_table alter column the_column type bigint using the_column::bigint
En fait, vous pouvez utiliser n'importe quelle expression en utilisant the_column
au lieu de the_column::bigint
pour personnaliser la conversion.
Notez que cela réécrira le tableau, verrouillant même les lecteurs jusqu'à ce que ce soit fait.
Vous pouvez créer une colonne temporaire de type bigint
, puis exécuter SQL comme
UPDATE my_table SET bigint_column=varchar_column::bigint;
Ensuite, déposez votre varchar_column et renommez bigint_column. C'est un peu un rond point, mais ne nécessitera pas de casting personnalisé dans postgres.
Concevez votre propre distribution personnalisée de chaîne en bigint. Quelque chose comme ça:
CREATE OR REPLACE FUNCTION convert_to_bigint(v_input text)
RETURNS BIGINT AS $$
DECLARE v_bigint_value BIGINT DEFAULT NULL;
BEGIN
BEGIN
v_bigint_value := v_input::BIGINT;
EXCEPTION WHEN OTHERS THEN
RAISE NOTICE 'Invalid bigint value: "%". Returning something else.', v_input;
RETURN 0;
END;
RETURN v_bigint_value;
END;
Créez ensuite une nouvelle table fixed_table_with_bigint
avec les mêmes paramètres que l’ancienne table, à l’exception de la colonne string dans la colonne bigint.
Ensuite, insérez toutes les lignes de la table précédente (à l'aide de la conversion personnalisée convert_to_integer
) dans la nouvelle table:
insert into fixed_table_with_bigint
select mycolumn1,
convert_to_bigint(your_string_bigint_column),
mycolumn3
from incorrect_table
Il se peut que vous deviez modifier convert_to_bigint
afin de gérer des chaînes qui ne sont pas des nombres, des chaînes vierges, des valeurs NULL, des caractères de contrôle et autres éléments étranges.
Supprimez ensuite la première table et renommez la deuxième table en tant que première table.