Page 1 sur 1

éclater CP en 2 champs => UPDATE dans la table

Posté : 20 déc. 2006, 05:15
par karpediem
Bonjour,
Je ne suis pas sure que mon titre soit très explicite, alors je vais m'expliquer ;o)
J'ai 1 table VILLE (35000 enregistrements environ) qui est composé de 3 champs :
- departement (varchar 2)
- cp (varchar 5)
- ville (varchar 52)
Actuellement, je n'ai pas de clé car j'ai récup les valeurs à partir d'un fichier excell et il y a quelques doublons.
Ce fichier excell ne contenait que cp et ville, avec pour une valeur de cp de 01850 => 1850 ;-( c'est le 1er pb...
Ma table n'est que partiellement alimentée...
Je souhaiterai pouvoir pour chaque enregistrement :
- alimenter le département avec les 2 premiers caracteres du cp si cp.length = 5 ;
- alimenter le département avec 0 + le premier caractere du cp si cp.length = 4 ;
- remplacer le cp actuellement sur 4 ou 5 caractères par les 3 derniers (le complément de département) ;
Je ne vois pas de façon simple pour effectuer cette opération... peut-être qu'un (plusieurs) UPDATE astucieux pourrait le faire...
Et vous, vous avez des idées / suggestions ?
MERCI de m'avoir au moins lu ;o)

Posté : 20 déc. 2006, 08:18
par Cyrano
Ça veut dire que pour le code postal, tu as utilisé un type numérique, un type CHAR(5) aurait été plus approprié. Mais il y aurait une alternative : laisser le type numérique mais avec l'option ZEROFILL qui va forcer le zéro initial. attention à la longueur du champ (5).

Posté : 20 déc. 2006, 13:28
par karpediem
bonjour,
Le 0 je l'ai "perdu" car dans le fichier excell d'origine il n'y était pas car dans les cellules si on tape 01 excell met 1 ;-(
C'est pour cela que je dois maintenant l'ajouter... ça ce n'est que le 1er pb ;o)
Pour l'instant cette table est une table de "travail". Je souhaite la rendre propre pour après pouvoir faire les traitements appropriés. Comme les infos vont me servir à alimenter des listes déroulantes, je pense même que je l'éclaterai en 2 tables afin d'optimiser les traitements => 1 pour les départements et 1 pour ville + cp.
Il ne reste plus qu'à ;o)
Sur 1 valeurs, je vois bien comment éclater mon cp en 2 car + 3 avec les substr et strlen mais je ne vois pas comment faire "facile" sur la table...
Aurais-tu une idée ?

Posté : 20 déc. 2006, 13:32
par Ajoloca
Bonjour,

Si dans ta nouvelle table tu as déclaré ta colonne cp en VARCHAR() tu peux utiliser "LPAD()".

Si tu choisis cette solution.
Pour ton département, n'oublie pas d'utiliser "LPAD()" avabt le "SUBSTR()"
SUBSTR(LPAD())

EDIT:

Donne-nous la structure actuelle et celle que tu voudrais obtenir.

Posté : 20 déc. 2006, 14:06
par karpediem
Bjr,
Actuellement ma table "ville" a la structure suivante (mais elle peut être modifiée...)
- dep : char(2) (champ actuellement vide)
- cp : varchar(5) (contient les infos)
- ville : varchar(52) (contient des infos)

La structure optimisée serait :

- dep : char(2)
- cp : char(3)
- ville : varchar(52)

Voili voilu...

Posté : 20 déc. 2006, 14:17
par Ajoloca
Re,
Si je comprends bien la structure actuelle est bonne, seules les données ont un PB (certains cp 4 caractères)

Mais je vois un souci dans la définitive, pas de clé primaire.

Regarde ce lien tu as la base officielle 2006 de l'INSEE disponible au téléchargement.
a devrait résoudre pas mal de PB's

Posté : 20 déc. 2006, 15:37
par karpediem
c'est bien là que je l'ai trouvée ;o) on importe de csv et là, pas de 0 devant les chiffres ;-(
pour le moment ma table n'a pas de clé car c'est celle qui m'a permis de récupérer les données... maintenant je vais les traiter...
je pense que ce qui me manquait crucialement c'était la fonction SUBSTR(LPAD)... je vais tester et je te dis...
par ailleurs, j'ai un autre pb... je ne sais pas si je dois faire un autre post ? voila j'ai un formulaire avec un INPUT où je saisie une date au format jj-mm-aaaa mais dans ma base j'obtients 0000-00-00 vide bien sûr ;-((
Aurais-tu une idée ou dois-je faire un autre post ?
Merci et @ +

Posté : 20 déc. 2006, 15:42
par Ajoloca
Re,

Utilise DATE_FORMAT() et ton PB sera résolu.

Posté : 20 déc. 2006, 16:17
par karpediem
re,

ok, je regarde ça et je te tiens au courant...

merci déjà pour le temps que tu m'as accordé ;o)

karpediem

Posté : 21 déc. 2006, 03:51
par Invité
pour le pb FORMAT_DATE => je suis sur forum MySQL FR sur un post qui existait déjà et qui correspond exactement à ce pb...

afin de ne pas solliciter doublement les GP (Gentils Participants ;o)) je reste de l'autre côté, tout du moins pour ce pb...

merci et à bientôt

Posté : 21 déc. 2006, 04:01
par karpediem
au cas où ça interesserait quelqu'un, voici une solution trouvée pour le pb de date...

INSERT INTO fiche (id_fiche, date_fic) VALUES (26, STR_TO_DATE('14-12-2006','%d-%m-%Y'))

ça c'est fait, je retourne sur mon autre pb...

Posté : 21 déc. 2006, 04:06
par Ajoloca
Re,

Je t'ai donné une réponse sur le site en question.

Pour que ça puisse aussi aider d'autres je te la donne ici aussi.

Pour convertir une date du format français au format MySQL il faut utiliser la fonction MySQL "STR_TO_DATE()" et non "DATE_FORMAT()".

Les paramètres sont une chaine et le format.
Un Exp.
On veut inserer une date 14-12-2006 dans une colonne MySQL de type "DATE"
INSERT INTO nom_table (nom_col_date) VALUES (STR_TO_DATE('14-12-2006', '%d-%m-%Y');
DATE_FORMAT() part du format MySQL et transforme la date au format voulu
En reprenant l'exemple précédent
Dans la base on aurait 2006-12-14. Pour la récupérer au format français
SELECT DATE_FORMAT(nom_col_date, '%d-%m-%Y') AS date_fr FROM nom_table;

Posté : 21 déc. 2006, 04:08
par karpediem
ça y est, j'ai tout compris, c'est super clair !

MERCI ! MERCI ! et encore MERCI !

Posté : 21 déc. 2006, 04:53
par karpediem
Si ça interesse quelqu'un....

Pour le pb de ma table des villes...

Voila ce que j'ai fait sur les conseils de Ajoloca ;o) pour récupérer le departement dans un champ...

UPDATE ville SET departement=SUBSTR(LPAD(cp,5,'0'),1,2)

Et voila, le tour est joué !

MERCI et @ +