開始準備使用WM_CONCAT,放進去之後發現提示沒有這個函數。
查了一下原來是因爲這個函數依賴WMSYS用戶,這個版本並沒有配置,無奈只能退而求其次選擇了listagg函數。一輪下來效果不錯,想要的效果可以實現。
SELECT
r.department_id law_dept_id,
(
SELECT
listagg (
rt.extracted_person_ids,
','
) WITHIN GROUP (
ORDER BY
rt.extracted_person_ids
)
FROM
RANDOM_TASK rt,
SYS_DEPARTMENT sd
WHERE
rt.CREAT_DEPARTMENT_ID = sd.DEPARTMENT_ID
AND sd.DEPARTMENT_NUMBER LIKE CONCAT (r.department_num, '%')
AND rt.distributed_state = 1
AND rt.STATE = 1
AND rt.LAUNCH_DATE BETWEEN TO_DATE ('2017-07-05', 'yyyy-mm-dd')
AND (TO_DATE('2017-07-05', 'yyyy-mm-dd') + 1)
) law_user_str
FROM
random_user_count r
ORDER BY
r.area_code,
r.department_num;
可是某一天,這段sql在運行的時候突然報錯,提示“字符串連接的結果過長”,網上查詢之後才知道,原來用listagg進行拼接,返回的結果是varchar類型,而且有最大長度限制,可以轉成club或者截取。。。
後來根據各種鏈接,找到一個相對靠譜的回答,點擊打開鏈接
改了之後的sql如下:
SELECT
r.department_id law_dept_id,
(
SELECT
-- listagg (
-- rt.extracted_person_ids,
-- ','
-- ) WITHIN GROUP (
-- ORDER BY
-- rt.extracted_person_ids
-- )
xmlagg(xmlparse(content rt.extracted_person_ids||',' wellformed) order by rt.extracted_person_ids).getclobval()
FROM
RANDOM_TASK rt,
SYS_DEPARTMENT sd
WHERE
rt.CREAT_DEPARTMENT_ID = sd.DEPARTMENT_ID
AND sd.DEPARTMENT_NUMBER LIKE CONCAT (r.department_num, '%')
AND rt.distributed_state = 1
AND rt.STATE = 1
AND rt.LAUNCH_DATE BETWEEN TO_DATE ('2017-07-05', 'yyyy-mm-dd')
AND (TO_DATE('2017-07-05', 'yyyy-mm-dd') + 1)
) law_user_str
FROM
random_user_count r
ORDER BY
r.area_code,
r.department_num;