8
votes

Créez une chaîne délimitée à partir d'une requête dans DB2

J'essaie de créer une chaîne délimitée à partir des résultats d'une requête dans DB2 sur les Iseries (AS / 400). J'ai fait cela dans T-SQL, mais je ne trouve pas un moyen de le faire ici.

Voici mon code dans T-SQL. Je cherche un Equalelant dans db2. xxx

si les descriptions de ma table ressemblent à ceci:

desc 1
Desc 2
Desc 3

alors il retournera ceci:

desc 1, desc 2, desc 3


1 commentaires

Dans MySQL, ce serait 'group_concat ()'.


4 Réponses :


37
votes

Essentiellement, vous recherchez l'équivalent de la fonction d'agrégat group_concat de MySQL en DB2. Selon Un thread que j'ai trouvé , vous pouvez imiter ce comportement par traverser la fonction xmlagg : xxx

ceci retournerait xxx

(ou si je suis lire les choses correctement)


3 commentaires

+1, commentaire latéral: Si vous exécutez sur z / OS V10, changez comme varchar (1024) sur comme clob (1024)


Je cherchais cela depuis des années. Cela fonctionne exactement ce dont j'ai besoin. Merci.


Il devrait y avoir un bouton +10 pour des réponses comme celle-ci.



0
votes

J'essaie de le faire dans Oledb et d'après ce que je comprends que vous ne pouvez pas faire cela parce que vous ne pouvez rien faire de fantaisie dans SQL pour OLEDB comme DÉCLARE VARIABLES ou créer une table. Donc, je suppose qu'il n'y a pas de moyen.


3 commentaires

Je ne sais pas si cela était censé être un commentaire à ma réponse, mais ma réponse ne déclare pas de variables ni de créer des tables. Cela pourrait être que xmlagg n'est pas à votre disposition, cependant.


Correct, je suppose que je n'ai pas de xmlagg, car cela ne reconnaît pas ce que c'est dans une requête OLEDB.


Il peut utiliser une fonction de base de données



1
votes

Vous pouvez le faire en utilisant des expressions de table communes (CTES) et de la récursivité.

with                                                                
    cte1 as                                                             
        (select description, row_number() over() as row_nbr from checkbooks),

    cte2 (list, cnt, cnt_max) AS                              
        (SELECT VARCHAR('', 32000), 0, count(description) FROM cte1
         UNION ALL                                                        
         SELECT 
             -- No comma before the first description
             case when cte2.list = '' THEN RTRIM(CHAR(cte1.description)) 
                  else cte2.list || ', ' || RTRIM(CHAR(cte1.description)) end,   
                  cte2.cnt + 1, 
                  cte2.cnt_max                                
         FROM   cte1,cte2                                                 
         WHERE  cte1.row_nbr = cte2.cnt + 1 AND cte2.cnt < cte2.cnt_max ),                             

    cte3 as                                                          
        (select list from cte2 
         where cte2.cnt = cte2.cnt_max fetch first 1 row only)

select list from cte3;


0 commentaires

0
votes

Si vous exécutez DB2 9.7 ou plus, vous pouvez utiliser la fonction LISAGG. Regardez ici: http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2fcom.ibm.db2.luw.sql.ref.doc%2fdoc%2fr0058709.html


0 commentaires