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

PostgreSQL Discussion :

Fonction pour retourner des lignes "splittées"


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 249
    Par défaut Fonction pour retourner des lignes "splittées"
    Salut à toutes et à tous,

    Soit une table anc_lots contenant des colonnes :
    num_nouv_lot numeric(8,0)
    num_mandat numeric(4,0)
    centroide text.

    J'aurais besoin de créer une fonction qui me retourne tous les num_nouv_lots et tous les centroides splittés pour un mandat défini.

    Bon, ce n'est pas clair, j'en conviens.
    Donc voici un exemple :
    La table contient

    num_nouv_lot | num_mandat | centroide
    ------------------------------------------
    3 600 000 | 17 | 1-1
    3 600 001 | 17 | 1-2
    3 700 000 | 18 | 1-1
    3 700 001 | 18 | 1-2
    3 700 002 | 18 | 1-3,1-5
    3 700 002 | 18 | 1-17
    3 700 003 | 18 | 1-4

    Si je passe en paramètre 18 pour le num_mandat,
    j'aurais besoin d'un résultat (surement SETOF RECORD) de type

    centroide | num_nouv_lot
    -------------------------
    1-1 | 3 700 000
    1-2 | 3 700 001
    1-3 | 3 700 002
    1-4 | 3 700 003
    1-5 | 3 700 002
    1-17 | 3 700 002

    Je ne vois absolument pas comment faire, pourtant je me dis que ça ne doit vraiment pas être impossible. Pourtant je n'ai pas trouvé sur le net.
    Serait-ce impossible ou aurais-je mal cherché (ce qui me semble plus probable, mais quelle serait la recherche à faire dans ce cas ?)

    Une idée ?

    Merci d'avance,
    Jean-Marc

    PS : Je suis sous PostgreSQL 8.2.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Il y a une solution en passant par les tableaux.
    Il faut s'aider de la fonction string_to_array() qui va transformer l'expression '1-3,1-4, etc...' en tableau, et de la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create or replace function explode_array(in_array anyarray) returns setof anyelement as
    $$
        select ($1)[s] from generate_series(1,array_upper($1, 1)) as s;
    $$
    language sql immutable;
    qui va transformer le tableau en une suite de lignes, une par élément du tableau.

    Avec ça, la solution est une requête du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select explode_array(string_to_array(centroide, ',')) ,
      num_nouv_lot
     from anc_lots
     where num_mandat=18
    (à tester...)

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 249
    Par défaut Merci
    Merci estofilo, c'est TRES EXACTEMENT ce que je cherchais.

    Je buchais depuis plusieurs jours et tu m'as décoincé.

    Merci BEAUCOUP,

    Jean-Marc

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 21/01/2011, 22h15
  2. Réponses: 5
    Dernier message: 20/01/2009, 19h50
  3. Réponses: 14
    Dernier message: 09/04/2004, 13h44

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