为什么wm_concat在这里不起作用?

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)

我得到一个空白的结果......我做错了什么?

Kir*_*tev 6

如果您使用的是 11g,请尝试LISTAGG代替wm_concat初学者。


Thi*_*Jet 6

您必须避免使用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_pathxmlagg被介绍,但都效果很好的10.2.0.4.0

  • 'wm_concat`不再包含在`12c中. (2认同)