web-dev-qa-db-fra.com

Postgres Modifier la table pour convertir le type de colonne de char en bigint

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?

29
Lighthart

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.

77
araqnid

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.

4
Scott S

Comment convertir un type de colonne de chaîne en numérique ou en bigint dans postgresql

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.

0
Eric Leschinski