IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

extraire les valeur d'un champ multivalué


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 3
    Points
    3
    Par défaut extraire les valeur d'un champ multivalué
    Bonjour,

    Après avoir chercher vainement sur ce forum, je pose tout de même mon problème pour amélioration de la solution que j'ai écrite.
    J'ai une table T1 qui a en autre une colonne "typeMicroorganimes" ayant pour contenu des chaines de caractères de la forme "bactéries;levures;phages" ou "bactéries;champignons filamenteux;levures;plasmides" ou "levures". En fait pour un enregistrement donné ce champ est multivalué, contient des types de microorganismes séparées par des ";"
    voici une partie du contenu de la table T1
    NoCollection | typeMicroorganimes
    1 |bactéries;levures;phages
    2 |bactéries;champignons filamenteux;levures;plasmides
    3 |levures
    4 |champignons filamenteux;levures

    Mon besoin est d'extraire la liste de tous les types de microorganismes de la colonne. Remarque ce champ peut être vide ou il peut contenir un à n types de microorg ,soit 0 à n-1 ";"
    J'ai déjà réussi à extraire le 1ier type de microorg de tous les enregistrements par la requête suivante :
    select substring_index(typeMicroorganimes, ';',1) as Micro from T1 group by Micro
    le résultat me donne
    Micro
    bactéries
    champignons filamenteux
    levures

    Comment améliorer cette requête pour que "plasmides" et "phages" soient dans la liste? en d'autres termes comment, dans le fonction substring_index, on peut faire varier le nombre d'occurences de délimiteur en fonction du nombre de ";" de l'enregistrement?
    A moins qu'il y ait une toute autre solution?
    Merci d'avance pour les futures réponses.
    A+

  2. #2
    Membre éclairé
    Avatar de efficks
    Inscrit en
    Septembre 2005
    Messages
    712
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 712
    Points : 776
    Points
    776
    Par défaut
    Il serait plus facile de gérer cela directement dans le programme.
    Par contre, cette façon de faire (mettre plusieurs valeurs dans un champ) est très mauvaise. Tu as de la redondance de données, de plus, tu ne peuix pas faire de requêtes impliquant ces données dans des calculs de statistiques ou bien facilement extraire des données pour les utiliser. Cette technique est à proscrire dans un système de base de données puisque les BD sont conçues pour palier facilement à ce problème et sont conçues pour ça.
    Pour ce faire, tu vas te créer deux tables supplémentaires, l'une pour les microorganisme et leurs numéro et une autre pour garder la relation plusieurs à plusieurs entre les deux tables.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Tout d'abord merci de répondre.
    Je sais bien que s'est à proscrire d'avoir des champs, mais cette table est alimentée par un fichier texte issu d'un tableau excel que des correspondants m'envoient Effectivement le traitement en amont de ces fichiers serait à développer mais je voulais essayer de l'éviter!
    Concernant la requête que je vous ai présenter, auriez-vous un tuyau pour la rendre dynamique
    +

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Après des réajustements ma requête d'extraction est la suivante :
    SELECT substring_index( Microorg, ';', 1 ) AS Micro
    FROM `annuairecollectionsmicroorg`
    UNION SELECT substring( Microorg, length( substring_index( Microorg, ';', 1 ) ) +2, length( substring_index( Microorg, ';', 2 ) ) - length( substring_index( Microorg, ';', 1 ) ) -1 ) AS Micro
    FROM `annuairecollectionsmicroorg`
    UNION SELECT substring( Microorg, length( substring_index( Microorg, ';', 2 ) ) +2, length( substring_index( Microorg, ';', 3 ) ) - length( substring_index( Microorg, ';', 2 ) ) -1 ) AS Micro
    FROM `annuairecollectionsmicroorg`
    UNION SELECT substring( Microorg, length( substring_index( Microorg, ';', 3 ) ) +2, length( substring_index( Microorg, ';', 4 ) ) - length( substring_index( Microorg, ';', 3 ) ) -1 ) AS Micro
    FROM `annuairecollectionsmicroorg`
    GROUP BY Micro
    ORDER BY Micro

    Pour les puristes, je me doute que c'est de la bidouille, mais cela répond à mon besoin à 98%
    Merci encore pour l'aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Isoler les valeurs d'un champ multivalué
    Par cyberespion dans le forum IHM
    Réponses: 7
    Dernier message: 18/05/2011, 09h16
  2. Réponses: 2
    Dernier message: 16/06/2009, 02h42
  3. Récupérer la/les valeurs d'un champ multivalué
    Par nicolas2603 dans le forum VBA Access
    Réponses: 0
    Dernier message: 13/05/2008, 16h40
  4. Requete SELECT : prendre toutes les valeurs pour 1 champ
    Par fab22montpellier dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/09/2005, 09h12
  5. Réinitialiser les valeurs d'un champ de type identify
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/01/2005, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo