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

Requêtes PostgreSQL Discussion :

Conversion varying char en tableau et recherche dans ce tableau


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut Conversion varying char en tableau et recherche dans ce tableau
    Bonjour à tous,

    Le débutant est de retour .

    J'ai une nouvelle question peut être simple mais je ne trouve pas la solution.

    Voilà en fait j'ai 2 tables :
    apcom_poteaux
    num_pot insee
    2012953 69014
    1 69014
    807500 69014
    E000357 69014

    dossier_apcom
    ref_ope insee appuis
    ET_CAPFT_UIAURA_69095_SSC_PM40655_PA77563_PB86087 69014 807500, 807501, 807502, 807503, 807504
    ET_IMPL_UIAURA_69095_SSC_PM40655_PA77563_PB86087 69014 2012953, 2012952, 2012950, 2012951, 2012954
    ET_FTTH_UIAURA_69095_SSC_PM40655_PA77563_PB86060 69014 E000357, E000356, E000345, E000346, E000349, E000350, E000351, E000352, E000353, E000354
    ET_CAPFT_UIAURA_69014_SFA_PMZ56201_PA99901_PB105642 69014 310384, 310385, 310386, 310387, 310388, 310390, 000001, 310455, 310456, 310391, 310392, 310393, 310394, 310395

    A savoir que normalement le format de la donnée num_pot devrait faire 7 caractères mais en fait il s'avère que dans la réalité c'est pas le cas j'ai des num_pot qui ont entre 1 et 7 caractères.

    Voilà et ce que j'essai d'obtenir c'est ça :
    num_pot insee ref_ope
    2012953 69014 ET_IMPL_UIAURA_69095_SSC_PM40655_PA77563_PB86087
    1 69014 ET_CAPFT_UIAURA_69014_SFA_PMZ56201_PA99901_PB105642
    807500 69014 ET_CAPFT_UIAURA_69095_SSC_PM40655_PA77563_PB86087
    E000357 69014 ET_FTTH_UIAURA_69095_SSC_PM40655_PA77563_PB86060


    Au départ j'ai essayé la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.num_pot as num_pot,a.insee as insee, doss.ref_ope
    from apcom_poteaux a
    left join apcom_dossier doss on doss.insee=a.insee and doss.appuis like concat('%',a.num_pot,'%')
    Mais ca ne marche pas ça retrouvais tous 1 même au milieu des nombres.


    Donc j'étais passé sur cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.num_pot as num_pot,a.insee as insee, doss.ref_ope
    from apcom_poteaux a
    left join apcom_dossier doss on doss.insee=a.insee and doss.appuis like concat('%',LPAD(a.num_pot, 7, '0'),'%')
    Mais ici lorsque les nombres font moins de 7 caractères je ne les trouve pas.

    Donc j'en suis à me dire qu'il faudrait que je prenne mon champ 'appuis' que je le convertisse en un tableau en séparant au niveau des ','. Puis je reformate chaque morceaux du tableau pour avoir 7 caractères avec LPAD et enfin je fais ma recherche.

    Mais très franchement je ne vois pas du tout comment faire ça en sql. Après peut être qu'il y a plus simple.

    Vous auriez des idées ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Votre idée se déroule très bien en SQL :
    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
    19
    with cte_dossier_apcom (ref_ope, insee, num_pot) as
    (
    select ref_ope, insee
         , lpad(unnest(string_to_array(replace(appuis, ' ', ''), ',')), 7, '0')
      from dossier_apcom
    )
    select pot.num_pot
         , pot.insee
         , cte.ref_ope
      from apcom_poteaux     as pot
      join cte_dossier_apcom as cte  on cte.insee   = pot.insee
                                    and cte.num_pot = lpad(pot.num_pot, 7, '0');
     
    num_pot  insee  ref_ope
    -------  -----  ---------------------------------------------------
    1        69014  ET_CAPFT_UIAURA_69014_SFA_PMZ56201_PA99901_PB105642
    807500   69014  ET_CAPFT_UIAURA_69095_SSC_PM40655_PA77563_PB86087
    2012953  69014  ET_IMPL_UIAURA_69095_SSC_PM40655_PA77563_PB86087
    E000357  69014  ET_FTTH_UIAURA_69095_SSC_PM40655_PA77563_PB86060
    Testé sur : https://www.db-fiddle.com/f/izcTGxT9onAoDhXWizL7LL/0

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut
    Super merci.

    J'étais de mon coté arrivé à peu près à la même solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select distinct a.num_pot as num_pot,a.insee as insee, doss.ref_ope
    from apcom_poteaux a
    left join (select ref_ope, insee, pmz, pa, LPAD(regexp_split_to_table(replace(appuis,' ',''),','), 7, '0') as appuis
    	from apcom_dossier) doss on doss.insee=a.insee and doss.appuis = LPAD(a.num_pot, 7, '0')
    Je ne connaissais pas l'utilisation du with. Est-ce que cela change quelque chose ? Par exemple sur les temps d'exécution ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par Coco47 Voir le message
    Je ne connaissais pas l'utilisation du with. Est-ce que cela change quelque chose ? Par exemple sur les temps d'exécution ?
    En temps d'exécution, intrinsèquement non, sauf si vous utilisez la sous-requêtes plusieurs fois.

    Je trouve (et c'est un avis personnel) que ça permet d'éviter d'avoir trop de sous-requêtes imbriquées, quand il y a un niveau ça va, quand il y a en 6 ou 7 c'est illisible.
    Le with permet une structure plus organisée (c'est comme si on déclarait une vue valide le temps de la requête).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut
    Ok je comprends.

    De mon coté j'imbriquais tout car après je transfert ces requête dans du code vba dans un fichier excel et que je voulais limiter le nombre le lignes .

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut
    Hello j'ai de nouveau un soucis avec cette requête.

    Maintenant que tout ça fonctionne je me retrouve avec des doublons due à mes données d'entrées. En fait il arrive que je retrouve plusieurs fois num_pot et insee dans des ref_ope différents :
    num_pot insee ref_ope etude
    1100915 69136 ET_CAPFT_UILYO_69136_GIV_PM20828_PA37971_PB54665 28/05/2020
    1100915 69136 ET_CAPFT_UILYO_GIV_PM20828_PA37971_PB54665 06/05/2019

    Mon idée serait de filtrer ca en prenant la date la plus récente. Mais j'arrive pas à faire ça.

    J'ai essayer en faisant un self join et en utilisant la fonction max sur la date mais je ne m'en sors pas.

    Si vous avez une idée ?

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

Discussions similaires

  1. Conversion string=>char c/c++ pour utiliser dans fonction
    Par pierro91 dans le forum Débuter
    Réponses: 11
    Dernier message: 12/02/2014, 13h54
  2. [VBA-E]Recherche dans un tableau
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 49
    Dernier message: 05/07/2006, 10h35
  3. [VBA-E] recherche dans un tableau
    Par tibss dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 03/05/2006, 17h52
  4. Recherche dans Tableau de point
    Par Platypus dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 30/08/2005, 18h29
  5. URGENt: recherche dans un tableau trié par ordre alphabetiqu
    Par JulPop dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/02/2005, 17h21

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