सौभाग्य से, यह listagg( ... )
. के साथ काम करता है 11.2
. के बाद से प्रदान किया गया फ़ंक्शन (हम पहले से ही चल रहे हैं), इसलिए हमें आगे जांच करने की आवश्यकता नहीं थी:
listagg( abc, ',' ) within group ( order by abc )
(जहां wm_concat(...)
जैसा कि किसी को पता होना चाहिए, कुछ आंतरिक और आधिकारिक रूप से असमर्थित कार्य है।)
a बल्कि अच्छा समाधान
(क्योंकि यह इतना फूला हुआ नहीं है) distinct
को लागू करने के लिए कार्यक्षमता स्व-संदर्भित regexp कार्यक्षमता के माध्यम से है जो कई मामलों में काम करना चाहिए:
regexp_replace(
listagg( abc, ',' ) within group ( order by abc )
, '(^|,)(.+)(,\2)+', '\1\2' )
(हो सकता है/उम्मीद है कि हम कुछ काम करते हुए देखेंगे listagg( distinct abc )
भविष्य में कार्यक्षमता, जो wm_concat
. की तरह बहुत साफ-सुथरी और शानदार होगी वाक्य - विन्यास। उदा. Postgres' string_agg( distinct abc )
के साथ लंबे समय से यह कोई समस्या नहीं है )
-- 1: postgres sql example:
select string_agg( distinct x, ',' ) from unnest('{a,b,a}'::text[]) as x`
यदि सूची 4000 वर्णों से अधिक है , एक listagg
का उपयोग नहीं कर सकता अब और (ORA-22922
फिर से)। लेकिन सौभाग्य से हम xmlagg
. का उपयोग कर सकते हैं यहां कार्य करें (जैसा बताया गया है यहां
).यदि आप एक distinct
को समझना चाहते हैं एक 4000-वर्ण-छंटनी परिणाम पर यहां, आप (1)
को मात दे सकते हैं -चिह्नित पंक्तियाँ ।
-- in smallercase everything that could/should be special for your query
-- comment in (1) to realize a distinct on a 4000 chars truncated result
WITH cfg AS (
SELECT
',' AS list_delim,
'([^,]+)(,\1)*(,|$)' AS list_dist_match, -- regexp match for distinct functionality
'\1\3' AS LIST_DIST_REPL -- regexp replace for distinct functionality
FROM DUAL
)
SELECT
--REGEXP_REPLACE( DBMS_LOB.SUBSTR( -- (1)
RTRIM( XMLAGG( XMLELEMENT( E, mycol, listdelim ).EXTRACT('//text()')
ORDER BY mycol ).GetClobVal(), LIST_DELIM )
--, 4000 ), LIST_DIST_MATCH, LIST_DIST_REPL ) -- (1)
AS mylist
FROM mytab, CFG