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 :

Recomposer les éléments d'un champ


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'études

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Recomposer les éléments d'un champ
    Bonjour,

    Je souhaite comparer un champ que je dois contrôler et un champ que je calcule.
    Le champ que je calcule est trié de manière croissante (plusieurs noms de boîtiers sur un poteau).
    En revanche, le champ que je dois contrôler est remplit manuellement, donc les boîtiers ne sont pas nécessairement indiqué dans le bon ordre.

    Dans l'exemple ci-dessous, le gid N°1 apparaîtrait en erreur alors que les boîtiers sont bien tous indiqués.
    Comment puis-je réordonner la liste à l'intérieur du champ pour que la comparaison des deux champs fonctionne ?

    Merci

    Nom : Sélection_039.png
Affichages : 188
Taille : 13,8 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT pt.gid
    ,pt.boitiers AS a_controler
    ,string_agg(bp.nom,';' ORDER BY bp.nom) AS concat
    from "input".poteau AS pt
    left join "input".boitier AS bp on ST_INTERSECTS(pt.geom,bp.geom)
    group by pt.gid,pt.boitiers
    having pt.boitiers != string_agg(bp.nom,';' ORDER by bp.nom)

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bonjour,
    Quel SGBD ?
    Et combien de mots séparés par des ; ?
    Un nombre fixe ou une infinité ...

    Je pensais à la fontion PostgreSQL SPLIT_PART() ou STRING_SPLIT (Transact-SQL) etc.
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    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 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Pourquoi ne décomposes-tu pas la chaine pour transformer les valeurs en lignes? Ce serait plus simple à comparer. Quelle est la BDD?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'études

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour à vous deux,
    Je travaille avec PGAdmin III sur PostgreSQL 9.6.
    Les boîtiers sont composés de 14 caractères et séparés par un point virgule.
    Le nombre de boîtiers est variable (ne sera jamais fixe, voire est même souvent vide car des poteaux n'ont pas de boîtiers), mais ne dépassera que rarement 4 ou 5 boîtiers (voire jamais... les poteaux c'est juste pour formaliser quelque chose ici).

    Pourquoi ne décomposes-tu pas la chaine pour transformer les valeurs en lignes?
    C'est ce que j'aimerais bien faire oui ! Pour pouvoir les réordonnée et pouvoir les comparer !

    Je pensais à la fontion PostgreSQL SPLIT_PART() ou STRING_SPLIT (Transact-SQL) etc.
    Je vais creuser ces fonctions merci !

    Merci !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'études

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    SPLIT_PART fonctionne bien.
    J'ai donc autant de colonnes que de SPLIT_PART, et donc de boîtiers.
    Désormais je dois essayer de créer une dernière colonne qui concatène tous ces boîtiers dans l'ordre ASC.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'études

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    J'ai trouvé ça mais ça ne marche que pour deux valeurs...
    https://dba.stackexchange.com/questi...nd-then-concat
    et encore, lorsqu'il y en a une seule, un point-virgule se trouve au début du concat...

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 400
    Points
    7 400
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MATHIEUGODARD Voir le message
    C'est ce que j'aimerais bien faire oui ! Pour pouvoir les réordonnée et pouvoir les comparer !
    Ce que demande vanagreg, c'est surtout pourquoi :
    - Dans la base de données, les boîtiers ne sont pas stockés comme sous-lignes des poteaux (ainsi, n lignes de boîtiers par poteau)
    - Et pourquoi dans l'application 1/ la saisie se fait sur une ligne avec des points virgules plutôt qu'un champ par boîtier 2/ pourquoi l'application ne découpe-t-elle pas la saisie pour envoyer au SGBD une ligne par boîtier

    En effet, une colonne dans la base de donnée doit toujours ne contenir qu'une et qu'une seule valeur : là vous allez au devant de gros problèmes de performance, de maintenabilité... et d'évolutivité ! (genre impossible de gérer l'intégrité si un jour vous avez une table avec la liste des codes des boîtiers)
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'études

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    - Dans la base de données, les boîtiers ne sont pas stockés comme sous-lignes des poteaux (ainsi, n lignes de boîtiers par poteau)
    Dans notre MCD d'étude (c'est de la cartographie), j'ai un shape poteaux, et un shape boitiers.
    Le contrôle que je réalise est fait à partir d'un string_agg qui me permet de générer cette liste à partir d'une jointure spatiale.
    Une fois l'étude terminée, le MCD entier est transformé dans un autre MCD pour livraison client. Je ne peux pas changer le format d'étude en milieu de projet et encore moins demander au client qu'il change son cahier des charges
    Et pourquoi dans l'application 1/ la saisie se fait sur une ligne avec des points virgules plutôt qu'un champ par boîtier 2/ pourquoi l'application ne découpe-t-elle pas la saisie pour envoyer au SGBD une ligne par boîtier
    1/ C'est la demande du client, je n'ai pas la main sur le remplissage de ce champ.
    2/ Mes données d'entrées sont comme tel : un shape poteaux, et un shape boitiers où, spatialement, plusieurs boitiers peuvent être superposés au poteau.
    En résumé, il n'est pas difficile pour moi de faire une liste des boîtiers présents sur un poteau grâce à une jointure spatiale. En revanche, vérifier la chaîne de caractères que je reçois en entrée de contrôle (de mes collègues, avant de transformer en MCD client) est plus compliqué. J'ai bien une solution en tête mais ce n'est pas hyper propre...

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 400
    Points
    7 400
    Billets dans le blog
    1
    Par défaut
    Comme dirait le commercial de ma boîte :

    Shit in, shit out.
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    Un truc dans ce gout là devrait faire le job (pas testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT pt.gid
    ,pt.boitiers AS a_controler
    ,string_agg(bp.nom,';' ORDER BY bp.nom) AS concat
    from "input".poteau AS pt
    left join "input".boitier AS bp on ST_INTERSECTS(pt.geom,bp.geom)
    group by pt.gid,pt.boitiers
    HAVING sum(CASE WHEN pt.boitier LIKE '%' || bp.nom || '%' THEN 1 ELSE 0 END) <> (char_length(pt.boitier) + 1) / 15
    	OR COUNT(*) <> (char_length(pt.boitier) + 1) / 15
    Mais comme déjà évoque, il ne faut pas s'attendre à de bonnes perfs en raison du modèle...

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'études

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Waouh Honnêtement pas compris le script Et il ne donne pas vraiment le résultat attendu. Mais merci à toi d'avoir tenté sans filet !
    J'ai réussit à faire ce que je souhaitais faire. C'est pas propre, c'est même immonde, mais ça fonctionne !
    Le souci de performance n'est pas du tout une problématique qui m'intéresse sur ces contrôles : je souhaite contrôler ce que mes collègues m'envoient et contrôler à la main me prendrait largement plus de 89 ms

    La méthode que j'ai employé :
    - J'ai effectué le STRING_AGG pour obtenir la réalité des géométries livrées et qui me permet de contrôler la donnée d'entrée
    - J'ai effectué le SPLIT_PART pour obtenir une colonne par boitier
    - J'ai effectué le SPLIT_PART également, avec la donnée d'entrée pour obtenir la même chose
    - J'ai comparé, à l'aide d'opérateurs OR et AND colonnes par colonnes...

    Désolé si ce message a rendu aveugle certain.e.s d'entre vous

    Merci à vous pour le temps que vous m'avez accordé !

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par MATHIEUGODARD Voir le message
    Dans notre MCD d'étude (c'est de la cartographie), j'ai un shape poteaux, et un shape boitiers.
    Le contrôle que je réalise est fait à partir d'un string_agg qui me permet de générer cette liste à partir d'une jointure spatiale.
    Une fois l'étude terminée, le MCD entier est transformé dans un autre MCD pour livraison client. Je ne peux pas changer le format d'étude en milieu de projet et encore moins demander au client qu'il change son cahier des charges

    1/ C'est la demande du client, je n'ai pas la main sur le remplissage de ce champ.
    2/ Mes données d'entrées sont comme tel : un shape poteaux, et un shape boitiers où, spatialement, plusieurs boitiers peuvent être superposés au poteau.
    En résumé, il n'est pas difficile pour moi de faire une liste des boîtiers présents sur un poteau grâce à une jointure spatiale. En revanche, vérifier la chaîne de caractères que je reçois en entrée de contrôle (de mes collègues, avant de transformer en MCD client) est plus compliqué. J'ai bien une solution en tête mais ce n'est pas hyper propre...
    Le cahier des charges du client mentionne peut être que les boîtiers d'un même poteau doivent être restitués sous forme de liste avec des points-virgules comme séparateurs, mais certainement pas qu'il faut pourrir le modèle de données en ne respectant pas la première forme normale.

    Comme indiqué par mes collègues, une colonne qui contient une liste de valeurs c'est la source de tous les maux : pas d'intégrité référentielle possible, requêtes complexes, performances désastreuses, modèle peu évolutif...

    Il ne faut pas confondre un champ, qui est une zone d'un formulaire ou d'un état, zone dans laquelle vous pouvez tout à fait positionner une liste de valeurs avec ou sans séparateurs, avec une colonne qui est un attribut dans une base de données et dont le contenu doit être scalaire.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'études

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    C'est le souci des formations sur un coin de table...
    Je précise tout de même que le MCD n'est absolument JAMAIS modifié (donc, je ne le pourrit pas). J'effectue des contrôles, je créé des tables temporaires dans d'autres schémas que l'input, et abonde une table qui résume toutes les erreurs trouvées pour que mes collègues modifient le jeu de données, jusqu'à ce qu'il soit intègre.
    Une batterie de contrôles est en jeu : contrôles géométriques (basiques et métiers) et attributaires (unicité, regex, listes de valeurs autorisées, métiers, ...).

    Si par ailleurs, vous aviez des cours en ligne qui permettent de vulgariser la chose, ça m'intéresse grandement. Je souhaite monter en compétence dans ce domaine. J'aimerais aussi apprendre PL/pgsql, mais la doc postrges est quand même assez raide à bouffer...

    Merci

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Pou ce qui concerne la modélisation (MCD, MLD, MPD), il y a un forum ici
    https://www.developpez.net/forums/f6...sation/schema/

    Forum à la racine duquel on trouve des références bibliographiques de tous niveaux
    Vous pourrez aussi bien sûr y poser directement vos questions, certains contributeurs de cette section sont extrêmement compétents et rigoureux dans la démarche, leur conseils vous seront précieux

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chargé d'études

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup

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

Discussions similaires

  1. [SP-2010] filtrer les éléments d'un champ "recherche" dans sharepoint 2010e
    Par francis.richter dans le forum SharePoint
    Réponses: 1
    Dernier message: 10/06/2011, 08h45
  2. Réponses: 6
    Dernier message: 19/11/2010, 18h27
  3. Lister les éléments d'un champ avec une formule
    Par noob77 dans le forum SAP Crystal Reports
    Réponses: 10
    Dernier message: 26/05/2009, 11h46
  4. Compter les éléments dans un champ
    Par sucreMan dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/05/2008, 12h11
  5. Réponses: 6
    Dernier message: 17/10/2006, 19h55

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