spr*_*t12 4 sql oracle oracle11g string-aggregation wm-concat
我有这个问题:
(SELECT OBJECT_ID from cr_object_group_entries_vw where object_group_id IN
(SELECT ITEM FROM TABLE(CR_FN_SPLIT_STRING('28,56',','))))
Run Code Online (Sandbox Code Playgroud)
返回:

但当我这样做时:
SELECT wm_concat(object_id) FROM
(SELECT OBJECT_ID from cr_object_group_entries_vw where object_group_id IN
(SELECT ITEM FROM TABLE(CR_FN_SPLIT_STRING('28,56',','))))
Run Code Online (Sandbox Code Playgroud)
我得到一个空白的结果......我做错了什么?
您必须避免使用wm_concat函数,因为它是未记录的,并且在Oracle 8i时被发现为变通方法.
由于Tom Kyte 在此发现了具有自定义聚合函数的旧方法,因此有一些新的解决方法,如下面的示例所示.
所有这些都在这个SQL Fiddle中重现.
解决方法1 - LISTAGG功能,适用于11g:
select listagg(object_id,',') within group (order by rownum) id_string
from cr_object_group_entries_vw
Run Code Online (Sandbox Code Playgroud)
解决方法2 - SYS_CONNECT_BY_PATH,自10g起作用:
select id_string from (
select rn, substr(sys_connect_by_path(object_id, ','),2) id_string
from (select object_id, rownum rn from cr_object_group_entries_vw)
start with rn = 1
connect by prior rn + 1 = rn
order by rn desc
)
where rownum = 1
Run Code Online (Sandbox Code Playgroud)
解决方法3 - XMLAGG,自10g起作用:
select replace(
replace(
replace(
xmlagg(xmlelement("x",object_id)).getStringVal(),
'</x><x>',
','
),
'<x>',
''
),
'</x>',
''
) id_string
from cr_object_group_entries_vw
Run Code Online (Sandbox Code Playgroud)
PS我不知道要到哪个Oracle版本sys_connect_by_path和xmlagg被介绍,但都效果很好的10.2.0.4.0
| 归档时间: |
|
| 查看次数: |
20061 次 |
| 最近记录: |