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

SQL Oracle Discussion :

Rechercher une valeur dans un champ multi-dimension


Sujet :

SQL Oracle

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2024
    Messages : 2
    Par défaut Rechercher une valeur dans un champ multi-dimension
    Bonjour

    je débute dans SQL et je suis à la recherche d'une fonction qui me permette de rechercher une valeur dans un champ multi-dimension dans une Table sur base ORACLE.

    j'ai une table PROFILMOD qui a été désignée comme suit avec des champs
    - Code utilisateur --> code champ oracle UTI_0 (1 dimension)
    - Profil Modèle --> qui a une dimension de 99 occurrences possible --> code champs oracle PRFMOD_0, PRFMOD_1, PRFMOD_2, PRFMOD_3, ... , PRFMOD_99

    et je veux rechercher tous les utilisateurs qui possède une valeur profil modèle, exemple "CPTA"
    lors de la création de l'utilisateur, celui qui créé l'utilisateur, peut lui affecter plusieurs profils modèles
    et saisir le profil modèle "CPTA" dans l'un des 99 Champs possibles

    je peux donc faire la selection en listant la totalité des 99 champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from PROFILMOD
      where PRFMOD_0 = 'CPTA' or PRFMOD_1 = 'CPTA' or PRFMOD_2 = 'CPTA' ... or PRFMOD_99 = 'CPTA'
    existe une façon plus simple de faire la selection sur le champ PRFMOD(99) qui contient la valeur "CPTA" sur les 99 occurrences ?

    D'avance merci pour vos lumières
    Cdt
    Fabraham

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 167
    Par défaut
    Bonjour,

    Quelle horreur cette conception.
    Il n'y aura donc pas de simplification de requête possible. Tu peux juste réécrire différemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * from PROFILMOD
    where 'CPTA' in (PRFMOD_0, PRFMOD_1, PRFMOD_2, ... PRFMOD_99);

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2024
    Messages : 2
    Par défaut Merci
    Bonjour Vanareg

    Merci beaucoup pour ta réponse
    D'accord que la conception pas au top, mais faut faire avec quand tu passes derrière.

    Et effectivement bcp plus facile à maintenir avec ta proposition de code.
    Cdt
    François

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 133
    Par défaut
    Bonjour,

    Tu trouveras sans doute avantage à créer une vue pour normaliser cette modélisation déficiente.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    create  view PRFMOD
    as  select  ID_PROFMOD
            ,   0           as  NUM_COL
            ,   PRFMOD_0    as  PRFMOD
        from    PROFILMOD
    union all
        select  ID_PROFMOD
            ,   1           as  NUM_COL
            ,   PRFMOD_1    as  PRFMOD
        from    PROFILMOD
    union all
        ...
    union all
        select  ID_PROFMOD
            ,   99          as  NUM_COL
            ,   PRFMOD_99   as  PRFMOD
        from    PROFILMOD
    ;
    (Faute d'en savoir plus, j'ai nommé ici ID_PROFMOD la clé primaire de la table PROFILMOD)

    Ta requête deviendrait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select  *
    from    PROFILMOD   PRF
    where   exists
            (   select  1
                from    PRFMOD  PRM
                where   PRM.ID_PROFMOD  = PRF.ID_PROFMOD
                    and PRM.PRFMOD      = 'CPTA'
     
            )
    ;
    Tu pourrais même connaître la ou les colonnes dans laquelle se trouve la valeur cherchée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select  ID_PROFMOD
        ,   NUM_COL
    from    PRFMOD  PRM
    where   PRM.PRFMOD      = 'CPTA'
    ;
    L'avantage de passer par une vue, c'est que tu pourras l'utiliser à chaque fois que tu auras besoin de rechercher quelque chose dans ces colonnes
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 942
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Tu trouveras sans doute avantage à créer une vue pour normaliser cette modélisation déficiente.
    L'avantage de passer par une vue, c'est que tu pourras l'utiliser à chaque fois que tu auras besoin de rechercher quelque chose dans ces colonnes
    Autre avantage, une fois validé on peux intervertir les rôles :
    1- la nouvelle vue devient une table
    2- l'ancienne table devient une vue
    L'ajout de trigger INSTEAD OF permettra d'alimenter la nouvelle table via les écritures de la nouvelle vue

    Du coup, tu auras moins l'impression de subir en passant derrière

Discussions similaires

  1. [AC-2016] Recherche d'une valeur dans plusieurs champs d'une même table
    Par fgk2000 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 06/06/2018, 20h42
  2. [MongoDB] Recherche une valeur dans plusieurs champs
    Par boboss123 dans le forum NoSQL
    Réponses: 5
    Dernier message: 17/03/2017, 11h43
  3. Réponses: 5
    Dernier message: 15/11/2011, 23h42
  4. Recherche une valeur dans deux champs
    Par smotte761 dans le forum Langage
    Réponses: 2
    Dernier message: 25/03/2011, 17h13
  5. Conserver une valeur dans un champs
    Par zakfa dans le forum IHM
    Réponses: 5
    Dernier message: 04/10/2004, 08h48

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