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 :

Existe-t-il la même fonction en oracle ?


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Points : 68
    Points
    68
    Par défaut Existe-t-il la même fonction en oracle ?
    Bonjour à tous,

    J'avais besoins de réalier l'opération suivante : récupérer sur une seule ligne les informations provenant de plusieurs. Je m'explique :
    dans ma table j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ID_CANDIDAT      PERMIS
    4444              A
    4444              B
    4444              X
    4555              A
    4555              C
    et je veux afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID_CANDIDAT     PERMIS
    4444                   ABX
    4555                   AC
    Grâce à des recherches et des collègues on a trouvé l'expression suivante qui fonctionne super bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select  id_candidat , 
    array_to_string (array (select permis from permis_cand int where int.id_candidat = out.id_candidat), '')  
    from permis_cand out group by id_candidat
    Jusque là tout va bien.

    Manque de chance, je dois faire la même chose en ORACLE et là, j'ai rien trouvé !! Ou alors des choses très complexes !!

    Est-ce que quelqu'un connait une astuce simple qui ressemblerait à ce qui existe dans PGSQL ?

    Merci à tous
    @++
    Darcynette

  2. #2
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Bonjour,

    une maniere elegante de faire ca, est de créer un agrégat, ca donnerait un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE FUNCTION agg_concat(text, text)
      RETURNS text AS
    $BODY$
    BEGIN
     IF $2 IS NULL THEN
      RETURN $1;
     END IF;
     IF LENGTH($1)>0 THEN
       RETURN $1||$2;
     ELSE
      RETURN $2;
     END IF;
    END;$BODY$
      LANGUAGE 'plpgsql';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE AGGREGATE aggconcat(
      BASETYPE=text,
      SFUNC=agg_concat,
      STYPE=text
    );


    le select ressemblerait alors à :

    SELECT id_candidat , agg_concat(permis)
    FROM permis_cand out GROUP BY id_candidat


    la fonction est grossiere car elle ne met pas d'ordre et n'enleve pas les doublons, mais apres tu peux adapter, et sous oracle c'est je pense pas trop compliqué à adapter...
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Points : 68
    Points
    68
    Par défaut
    Merci pour ce premier tuyau !!
    Effectivement, je pensais faire un développeemnt dans le genre (fonction + appel de la fonction), mais je suis assez étonnée que PGSQL ait prévu quelque chose de simple et pas ORACLE
    Enfin, s'il n'existe rien d'autre, je vais m'en contenter

    encore merci

    @++
    Darcynette

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Points : 68
    Points
    68
    Par défaut autre astuce
    En fouillant sur le forum et le net, j'ai trouvé cette astuce qui s'applique bien dans mon cas car j'ai un nombre fixé de valeurs que je peux retourner.
    Je vous livre donc le script brut de pomme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT id_candidat candidat, 
           --max(c_permis_cand), 
    	   max(decode(seq,1,c_permis_cand, NULL))||max(decode(seq,2,c_permis_cand, NULL))||max(decode(seq,3,c_permis_cand, NULL))||max(decode(seq,4,c_permis_cand, NULL))||max(decode(seq,5,c_permis_cand, NULL)) as permis 
    FROM (
      SELECT id_candidat, 
      c_permis_cand,  
      row_number() over (partition BY id_candidat order by c_permis_cand) seq
      FROM permis_cand
         )
    WHERE seq <= 5
    GROUP BY id_candidat
    La première ligne est en commentaire car sinon j'ai des doublons dans ma colonne.
    Pour le reste, ce n'est certainement pas très beau mais ca fonctionne et comme il s'agit, comme on peut le constater, de récuprer des candidats et des permis, on peut facilement déterminer le nombre max de permis qu'il peut exister !

    @++
    Darcy

  5. #5
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Bien sûr que c'est possible avec Oracle, mais il faut faire une procédure toute bête, regarde ici ou ici ou ici, faut juste lire un peu. Bon courage
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/04/2012, 16h22
  2. Réponses: 2
    Dernier message: 05/12/2005, 12h16
  3. TForm pour plusieurs fenêtre dans une même fonction ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/11/2005, 12h38
  4. fonction équivalente à la fonction MOD (oracle) dans ms-sql
    Par rodrigue50 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/07/2005, 16h14
  5. [VB.NET] Appliquer plusieurs fois la même fonction...
    Par MiJack dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/09/2004, 10h52

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