PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 19/06/2012 10:00:11

youssef
Membre

transtypage

Bonjour 

en crant une table j'ai mis un champs qui à l'origine devrait être numérique en varchar,
est ce qu'il est possible de le modifier en numérique, sachant que toutes les valeurs sont numérique

est ce que postgres procède à un prototypage automatique ?
genre faire la somme de deux valeurs numérique même si le champs est déclarer string ou faut il passer par une autre méthode

Merci

Hors ligne

#2 19/06/2012 10:07:05

gleu
Administrateur

Re : transtypage

Pas de conversion automatique. Il faut lui indiquer qu'il faut convertir le champ text en champ integer par exemple. Le plus simple cependant est de modifier le type de la colonne (long mais meilleur après pour les perfs).


Guillaume.

Hors ligne

#3 19/06/2012 11:38:51

youssef
Membre

Re : transtypage

comment changer le type de la colonne ?

Hors ligne

#4 19/06/2012 11:40:16

gleu
Administrateur

Re : transtypage

En utilisant la commande ALTER TABLE (http://docs.postgresql.fr/9.1/sql-altertable.html).


Guillaume.

Hors ligne

#5 19/06/2012 11:57:16

youssef
Membre

Re : transtypage

ah ok, je connais bien alter table 
merci

une autre question, comment traiter cette erreur  :

ERROR:  numeric field overflow
DETAIL:  A field with precision 14, scale 13 must round to an absolute value less than 10^1.

********** Erreur **********

ERROR: numeric field overflow
État SQL :22003
Détail :A field with precision 14, scale 13 must round to an absolute value less than 10^1.


j'ai un champs string  qui est un numérique d'une précision de 16 et d'une echel de 15
quand j'essaye de faire

SELECT sum(to_number(monChamps ,'9D999999999999999'))
FROM matable ;

j'ai cette  erreur

Merci à vous

Hors ligne

#6 19/06/2012 12:44:39

gleu
Administrateur

Re : transtypage

Quelle version de PostgreSQL utilisez-vous ? car pour moi, cette requête ne passe pas.


Guillaume.

Hors ligne

#7 19/06/2012 17:05:46

youssef
Membre

Re : transtypage

j'ai la version 9.1

Hors ligne

#8 19/06/2012 17:40:11

gleu
Administrateur

Re : transtypage

La même requête exacte me met un message d'erreur. Donc je suppose que vous avez modifié la requête (notamment pour l'anonymiser mais que la modification fait qu'elle n'est plus exécutable sur une 9.1). Il faudrait nous donner la vraie requête si vous voulez qu'on puisse vous aider.


Guillaume.

Hors ligne

#9 19/06/2012 17:56:07

youssef
Membre

Re : transtypage

j'ai seulement changé le nom de la table et le nom de champs
par maTable et monChaémps,
même avec les bon noms ça marchera pas pour vous vu que vous ne disposer pas de la table;

un copier coller de la requête telle que je l'ai mise retournera surement une erreur

Hors ligne

#10 19/06/2012 22:14:33

rjuju
Administrateur

Re : transtypage

L'erreur indique qu'une des valeur de "monChamps" a une valeur absolue  >= 10, alors que votre conversion demande un nombre avec un seul chiffre avant la virgule.
Regardez dans votre table si c'est bien le cas (par exemple SELECT to_number(monChamps ,'9999D999999999999999') FROM matable where to_number(monChamps ,'9999D999999999999999') >= 10.0 ), et corrigez le problème (soit en changeant la conversion avec plus de chiffres avant la virgule, soit en modifiant les enregistrements concernés).
Vous pourrez alors modifier le type de votre champ.

Hors ligne

#11 19/06/2012 22:55:17

gleu
Administrateur

Re : transtypage

Évidemment, j'ai créé une table avec une colonne de type numeric. Et l'erreur que j'ai n'a rien à voir avec une table inexistante :

postgres=# select sum(to_number(champ,'9D999999999999999')) from toto;
ERROR:  function to_number(numeric, unknown) does not exist
LINE 1: select sum(to_number(champ,'9D999999999999999')) from toto;
                   ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Guillaume.

Hors ligne

#12 20/06/2012 08:52:34

youssef
Membre

Re : transtypage

la fonction to_number exite bien,

http://www.postgresql.org/docs/8.3/stat … tting.html

mais par contre le champs doit être en varchar,  d'ou lebut d'utiliser to_number pour pouvoir effectuer une somme,
il n'est pas possible de faire un to_number sur un champ numeric, parce que la fonction accepte deux arguments texte.

Hors ligne

#13 20/06/2012 08:57:37

youssef
Membre

Re : transtypage

rjuju a écrit :

L'erreur indique qu'une des valeur de "monChamps" a une valeur absolue  >= 10, alors que votre conversion demande un nombre avec un seul chiffre avant la virgule.
Regardez dans votre table si c'est bien le cas (par exemple SELECT to_number(monChamps ,'9999D999999999999999') FROM matable where to_number(monChamps ,'9999D999999999999999') >= 10.0 ), et corrigez le problème (soit en changeant la conversion avec plus de chiffres avant la virgule, soit en modifiant les enregistrements concernés).
Vous pourrez alors modifier le type de votre champ.


Merci pour ton explication,
j'avais pas bien compris le message d'erreur
effectivement, y avait des valeurs dont le nombre avant la virgule est supérieur à 10
j'ai changé le format de conversion, et j'ai eu le bon résultat que je cherchais

Hors ligne

Pied de page des forums