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 Firebird Discussion :

Equivalent de la fonction d'agregat LIST ?


Sujet :

SQL Firebird

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Equivalent de la fonction d'agregat LIST ?
    Bonjour à tous,
    J'ai pas mal cherché sur le forum sans succès.
    Je cherche à concaténer des champs avec une fonction de type sum mais pour les char.
    Il me semble qu'en SQL/99 on a la fonction LIST qui fait ça ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select LIST(id_employee,';') from employee
    groupy by id_pays=2;
    //renvoie par ex
    //1;2;5;8
    //liste des employées dont le pays est 2
    Je sais que je pourrais faire autrement, mais j'aimerais bien récupérér la valeur dans un select (comme pour une fonction sum ou count).
    Dois-je créer une fonction UDF pour celà (ou en existe_t'il une qui le fasse).
    Je ne connais pas du tout les fonctions UDF ou meme les PS, je débute sur Firebird.
    Merci d'avance

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Cette fonction n'existe pas en effet sous Interbase/Firebird.

    Je ne crois pas qu'on puisse la trouver ni même la programmer dans une UDF. En effet il faudrait non pas faire une simple fonction mais une fonction d'Agregation, et je ne crois pas que l'on puisse le faire dans une UDF.

    Le SQL 99 est loin d'être implémenté dans tous les SGBR et quand il l'est le plus souvant ce n'est que partiellement.

    Vous êtes De plus je ne suis pas certain certain que LIST fait parti de la norme SQL99 ?

    Sinon pour faire ce que vous cherchez à faire j'utilise en général une PS.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Merci de votre réponse,
    En effet, il semble bien que cette fonction ne soit pas couramment utilisée (d'ailleurs après plusieurs recherches sur Google je n'ai pas trouver un seul SGBD qui l'utilise).
    Bon, je crois bien que ca va être le moment de me pencher sur les PS :
    Je vais voir si ce n'est pas trop chaud pour mon petit niveau

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 379
    Points : 376
    Points
    376
    Par défaut liste
    c'est possible de construire une procédure stockée qui réponde à cette requête: SELECT * FROM LISTPAYS( 2 );
    ==> "2;3;5;10"

    Le code de cette procédure, bien sûr, il faudra ajuster le nom de la table et des champs...

    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
    20
    21
    22
    23
     
    CREATE PROCEDURE LISTIDPAYS
    (
      SEARCHCODEPAYS Integer)
     
    RETURNS(
      RESLISTPAYS VarChar(255))
     
    AS
    DECLARE VARIABLE CodePays Integer;
    BEGIN
     
      ResListPays = '';
     
      FOR
        SELECT CodePays FROM LibPays
        WHERE Parent = :SearchCodePays
      INTO :CodePays DO
        ResListPays = ResListPays || CodePays || ';';
     
      SUSPEND;
     
    END
    la table dont j'ai fait les tests à la structure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE LIBPAYS(
     codepays Integer,
     libelle VarChar(30),
     parent Smallint,
     rang Smallint,
     typ Smallint,
    branche Smallint );
    seul les champs codepays, libelle et parent sont utilisés.
    attention que si il y a trop de réponses, la variable de résultat "sautera" faute d'espace.

    avec firebird, quelques procédures stockées et des udf, rien n'est impossible!

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Merci pour cette solution. Je pense avoir plus ou moins compris le code. Ca a l'air super interressant ça.
    En attendant j'avais gardé une solution pas très optimisée mais là ca me simplifiera beaucoup la tache.

    Merci beaucoup. Je me mets sérieusement aux PS dès que possible et ensuite j'attaquerai les UDF.

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 379
    Points : 376
    Points
    376
    Par défaut
    a propos d'udf, j'en ai des kilomètres que je serais heureux de partager.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 23/10/2008, 13h58
  2. [PEAR][DB] Equivalent de la fonction "mysql_field_name()
    Par o151181 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 20/09/2005, 17h16
  3. Réponses: 9
    Dernier message: 24/05/2005, 16h34
  4. Comment rappeler une fonction dans une liste déroulante
    Par strogos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/05/2005, 23h54
  5. Equivalent de la fonction trim
    Par PCHINK dans le forum C
    Réponses: 6
    Dernier message: 21/03/2004, 18h02

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