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. P> si les descriptions de ma table ressemblent à ceci: p> desc 1 alors il retournera ceci: p> desc 1, desc 2, desc 3 p>
blockQuote> p>
Desc 2
Desc 3 P>
blockQuote>
4 Réponses :
Essentiellement, vous recherchez l'équivalent de la fonction d'agrégat ceci retournerait p> (ou si je suis lire les choses correctement) p> p> group_concat code> de MySQL en DB2. Selon Un thread que j'ai trouvé , vous pouvez imiter ce comportement par traverser la fonction
xmlagg code>:
+1, commentaire latéral: Si vous exécutez sur z / OS V10, changez comme varchar (1024) code> sur
comme clob (1024) code>
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.
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. P>
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 code> 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
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;
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 p>
Dans MySQL, ce serait 'group_concat ()'.