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
11gR2? Comment faire pour déterminer si je suis en utilisant 11gR2? Quand je lance
Le
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
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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
LISTAGG
.De sortie:
SQLFiddle
Mise à JOUR Si vous avez besoin pour obtenir distinctes des valeurs de texte dans une liste
SQLFiddle
J'ai un autre problème. Comment puis-je sélectionner des
TEXT
?Vous êtes les bienvenus. Voir mise à jour de réponse.
Si je peux upvote cette réponse encore une fois, je vais upvote ce. Mais je ne peux pas.:) Je vous remercie encore.
Heureux, il a aidé 🙂
OriginalL'auteur peterm
Problème avec LISTAGG qu'il renvoie varchar2 et est limité à 4000 octets
J'ai trouvé une solution de contournement, mais il semble laid et mutch est plus lent
OriginalL'auteur Žilvinas
Ne pas utiliser
WM_CONCAT
puisque c'est un fonctionnalité non documentée et il a été retiré à partir de la dernière 12c version. Toute application qui a été en s'appuyant surwm_concat
fonction ne fonctionnera pas une fois mis à niveau vers12c
. Voir Pourquoi ne pas utiliser WM_CONCAT fonction dans Oracle?Vous recevrez un “identifiant invalide” erreur:
Par conséquent, il est inutile de compter sur une fonctionnalité non documentée qui n'est plus disponible dans les versions les plus récentes.
Il existe différents agrégation de chaîne techniques:
Par exemple,
Par exemple,
Quelques exemples par Tim Hall ici.
OriginalL'auteur Lalit Kumar B
La suite a fonctionné pour moi sur un ORACLE 10.2.0.5.0 base de données:
Salut, pouvez-vous donner plus de détails sur la façon dont est l'impact sur les performances?
OriginalL'auteur John