Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/11/2004, 13h52   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2004
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 21
Points : 11
Points : 11
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 :
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
rahan15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2004, 12h30   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2004, 14h12   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2004
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 21
Points : 11
Points : 11
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
rahan15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2004, 18h59   #4
Membre éclairé
 
Inscription : décembre 2004
Messages : 379
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 379
Points : 304
Points : 304
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 :
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 :
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!
jean-jacques varvenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2004, 23h04   #5
Candidat au titre de Membre du Club
 
Inscription : avril 2004
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 21
Points : 11
Points : 11
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.
rahan15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2004, 22h21   #6
Membre éclairé
 
Inscription : décembre 2004
Messages : 379
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 379
Points : 304
Points : 304
a propos d'udf, j'en ai des kilomètres que je serais heureux de partager.
jean-jacques varvenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h59.


 
 
 
 
Partenaires

Hébergement Web