Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/07/2011, 16h03   #1
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Par défaut Extraire sous chaine de caractères

Bonjour,

J'ai une base de données Ogr dont un attribut UM est une chaine de caractères qui possède un certain nombre de fois une série de 5 chiffres. J'aimerais savoir s'il est possible d'extraire séparement les différentes séries de 5 chiffres de chaque ligne et celà pour toutes les lignes de ma base.
a1331 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 16h27   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 026
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 026
Points : 18 317
Points : 18 317
Envoyer un message via MSN à CinePhil
Donne la structure de la table, un petit jeu de données et le résultat attendu si tu veux qu'on t'aide efficacement.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 16h38   #3
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
UM est l'unique attribut de la table Org. Par exemple si j'ai les deux lignes suivantes de UM :

uN = 25415, bureau = 2B; uN = 15489, bureau = 12A
uN = 86764, bureau = 4M; uN = 15647, bureau = 2C; uN = 48789, bureau = 4A

je veux pouvoir extraire :
25415
15489
86764
15647
48789
a1331 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 18h46   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 026
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 026
Points : 18 317
Points : 18 317
Envoyer un message via MSN à CinePhil
Si les deux lignes de données que tu fournis dans ton message sont deux des lignes de la table, ça ne va pas être facile puisque nous sommes en présence d'une colonne multivaluée, ce qui est contraire aux principes des bases de données relationnelles. J'espère qu'il s'agit d'un import de données mal foutu et pas de la structure réelle de la BDD !

Travaillons avec la première chaîne de caractères 'uN = 25415, bureau = 2B; uN = 15489, bureau = 12A' et avec les fonctions de chaînes de caractères de MySQL.

1) Quelle est la position de la première occurrence de 'uN = ' ?
Code :
SELECT INSTR('uN = 25415, bureau = 2B; uN = 15489, bureau = 12A', 'uN = ')
=> Réponse : 1

2) Récupérons les 5 caractères qui suivent 'uN = ' :
Code :
1
2
3
4
5
SELECT SUBSTRING(
  'uN = 25415, bureau = 2B; uN = 15489, bureau = 12A' 
  FROM INSTR('uN = 25415, bureau = 2B; uN = 15489, bureau = 12A', 'uN = ') + 5 
  FOR 5
)
=> Résultat :
'25415'

3) Supprimons la première occurrence de 'uN = ' de la chaîne de départ :
Code :
1
2
3
4
SELECT RIGHT (
  'uN = 25415, bureau = 2B; uN = 15489, bureau = 12A',
  LENGTH('uN = 25415, bureau = 2B; uN = 15489, bureau = 12A') - INSTR('uN = 25415, bureau = 2B; uN = 15489, bureau = 12A', 'uN = ') - 10
) AS chaine_moins_premier_uN;
=> Résultat :
'bureau = 2B; uN = 15489, bureau = 12A'

4) Refaisons la même opération qu'en 2 pour avoir le second uN :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT SUBSTRING(
  RIGHT (
    'uN = 25415, bureau = 2B; uN = 15489, bureau = 12A',
    LENGTH('uN = 25415, bureau = 2B; uN = 15489, bureau = 12A') - INSTR('uN = 25415, bureau = 2B; uN = 15489, bureau = 12A', 'uN = ') - 10
  )
  FROM INSTR(
    RIGHT (
      'uN = 25415, bureau = 2B; uN = 15489, bureau = 12A',
      LENGTH('uN = 25415, bureau = 2B; uN = 15489, bureau = 12A') - INSTR('uN = 25415, bureau = 2B; uN = 15489, bureau = 12A', 'uN = ') - 10
    ), 
    'uN = '
  ) + 5
  FOR 5
) AS uN_2;
=> Résultat :
15489

Si tu bidouilles ça dans une procédure SQL qui injecte les résultats intermédiaires dans une table temporaire puis qui interroge celle-ci, tu devrais avoir ton résultat mais je reconnais que ça va être galère !

Un coup de Explode en PHP serait à mon avis plus simple !

Bon courage !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 09h31   #5
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Merci beaucoup pour ta réponse je vais tester ça.
a1331 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 10h48   #6
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Est ce que ce serait plus faisable si on avait :

uN = 21564, agence = M; uN = 56476, agence = M...

c'est à dire toujours la même chaine de caractères après 'uN = _ _ _ _ _ '?
a1331 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 12h14   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 026
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 026
Points : 18 317
Points : 18 317
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par a1331 Voir le message
Est ce que ce serait plus faisable si on avait :

uN = 21564, agence = M; uN = 56476, agence = M...

c'est à dire toujours la même chaine de caractères après 'uN = _ _ _ _ _ '?
Euh... il n'y a pas toujours la même chaîne de caractères après 'uN = ' ! Une fois 21564 et l'autre 56476 ! Ce sont justement ces nombres que tu veux récupérer.

Par contre, si tu as la possibilité de changer la structure des données qui donnent cette colonne multi-valuée, fais-le ! Ce sera beaucoup plus simple avec des données correctement modélisées !

Bis repetita :
Citation:
Envoyé par CinéPhil
J'espère qu'il s'agit d'un import de données mal foutu et pas de la structure réelle de la BDD !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 12h50   #8
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Je ne pense pas pourvoir modifier la structure. Je voulais savoir si les données autre que uN=21564 et uN=56476 sont un problème.
a1331 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 13h20   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 026
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 026
Points : 18 317
Points : 18 317
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par a1331 Voir le message
Je ne pense pas pourvoir modifier la structure. Je voulais savoir si les données autre que uN=21564 et uN=56476 sont un problème.
Non puisque j'ai réussi à extraire les deux données. Ce qui pose problème, c'est le fait qu'il y a plusieurs uN sur la même ligne.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h22.


 
 
 
 
Partenaires

Hébergement Web