Changer le séparateur de WM_CONCAT fonction d'Oracle 11gR2

Normalement, WM_CONCAT est une fonction d'agrégation que les valeurs de retour de la table séparés par des virgules, comme ici.

Supposons que j'ai une table foo comme ceci:

col_id     | col_text


111        | This

111        | is

111        | a

111        | test.

Si j'utilise cette requête:

SELECT CAST(WM_CONCAT(col_text) AS VARCHAR2(100)), col_id FROM foo

le résultat serait

This, is, a, test.

Est-il possible de modifier le séparateur(',') à d'autres personnages comme '.' ou '|' de la WM_CONCAT() fonction?

Ou de créer une fonction définie par l'utilisateur qui peut être exécuté comme WM_CONCAT()?

Si vous êtes sur 11gR2, alors vous devriez utiliser les listagg à la place. Si non il y a divers articles sur la façon d'écrire votre propre version de souvent liés les uns - mais vous avez besoin de spécifier la version que vous utilisez.
11gR2? Comment faire pour déterminer si je suis en utilisant 11gR2? Quand je lance SELECT * FROM V$VERSION; j'ai obtenu ceci: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production.
Le 11.2 partie de la chaîne de version signifie que vous avez 11g Release 2, de sorte que vous aurez listagg disponibles. (La version de base a été 11.2.0.1 si vous avez des correctifs appliqués sur le dessus de cela). Vous pourriez aussi tout simplement essayer de l'utiliser de cours *8-)
Mais j'ai un autre problème. Je ne peux pas simplement essayer parce que de la requête, j'ai créé plus tôt. Permettez-moi de mettre à jour ma question.
Ne pouvez-vous pas simplement exécuter @peterm de la version à la place? Dans votre version embarquée, il suffit de remplacer CAST (WM_CONCAT (C.CUST_NAME) AS VARCHAR2 (1500)) avec LISTAGG(C.CUST_NAME, '|') WITHIN GROUP (ORDER BY C.CUST_NAME). Vous pouvez cast ou substr que si vous avez vraiment besoin, mais il n'est probablement pas nécessaire.

OriginalL'auteur Christian Mark | 2013-05-28