Postgres Alter table pour convertir le type de colonne de char à bigint [dupliquer]
Doublon Possible:
Comment changer le type de données de 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 puis-je utiliser alter table pour convertir ce type de colonne en bigint?
3 réponses
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 termes de the_column
au lieu de the_column::bigint
pour personnaliser la conversion.
Notez que cela va réécrire la table, bloquant 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;
Déposez ensuite votre varchar_column et renommez bigint_column. C'est un peu rond-point, mais ne nécessitera pas un casting personnalisé dans postgres.
Comment convertir un type de colonne de chaîne en numérique ou bigint dans postgresql
Concevez votre propre distribution personnalisée de string à bigint. Quelque chose comme ceci:
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;
Ensuite, créez une nouvelle table fixed_table_with_bigint
avec les mêmes paramètres que l'ancienne table sauf changer la colonne string en colonne bigint.
Ensuite, insérez toutes les lignes de la table précédente (en utilisant le cast personnalisé 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
Vous devrez peut-être modifier convert_to_bigint
pour gérer les chaînes qui ne sont pas des nombres, blankstrings, nulls, caractères de contrôle et autres bizarreries.
Supprimez ensuite la première table et renommez la 2ème table en première table.