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?

28
demandé sur Community 2012-12-11 01:01:09

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.

75
répondu araqnid 2012-12-10 21:49:19

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.

4
répondu Scott S 2012-12-10 21:12:17

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.

0
répondu Eric Leschinski 2012-12-10 21:34:53