[英]Oracle Database 10g: collect, cast for string aggregation
我正在尝试使用collect
和cast
进行字符串聚合,类似于Oracle Database 11中的listagg
(同样,不幸的是,我正在查询的数据库上未启用wm_concat
)。 我也对该数据库具有只读访问权限。
我当前的查询如下
SELECT plan.EMPLID,
plan.STRM TERM,
CAST(COLLECT(plan.ACAD_PLAN) AS sys.dbms_debug_vc2coll) agg_plans
FROM SYSADM.PS_OSR_PLAN_TRM plan
WHERE plan.EMPLID = '999999999'
GROUP BY plan.EMPLID, plan.STRM
这给了我这个结果:
EMPLID TERM AGG_PLANS
999999999 1152 SYS.DBMS_DEBUG_VC2COLL(VARCHAR(ECON-MN, TXTLCLO-MN))
999999999 1154 SYS.DBMS_DEBUG_VC2COLL(VARCHAR(ACCTING-BS, ECON-MN))
我相信我的逻辑是正确的,但是我在cast
语句方面遇到了麻烦。 我知道sys.dbms_debug_vc2coll
的类型table of varchar2(1000)
。 我想从每一行中删除SYS.DBMS_DEBUG_VC2COLL(VARCHAR(
并仅列出结果。
有没有一种方法可以将结果集合连接成字符串? 此堆栈溢出后的帖子与我要查找的内容类似...但是,同样,我具有对该数据库的只读访问权限。 我也想尝试将其保留为一条select语句。
谢谢你的帮助。
编辑:我不反对使用xmlagg
的解决方案。
您可以如下使用XMLAGG()
:
SELECT plan.emplid, plan.strm AS term
, RTRIM( XMLAGG( XMLELEMENT(e, plan.acad_plan || ',') ORDER BY plan.acad_plan ).EXTRACT('//text()'), ',' ) AS agg_plans
FROM sysadm.ps_osr_plan_trm plan
WHERE plan.emplid = '999999999'
GROUP BY plan.emplid, plan.strm;
注意, XMLELEMENT()
的第一个参数可以是任何参数,它只是XML标记,其中plan.acad_plan || ','
的值 plan.acad_plan || ','
将被包装,最终将被丢弃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.