Oracle XMLQuery-显示带有两个XML节点的逗号分隔列表
我有这样的疑问-Oracle XMLQuery-显示带有两个XML节点的逗号分隔列表,oracle,xpath,oracle11g,oracle-xml-db,Oracle,Xpath,Oracle11g,Oracle Xml Db,我有这样的疑问- WITH xtbl AS (SELECT xmltype ('<root> <parent> <item> <item_detail>AAA</item_detail> <item_amount>1000<
WITH xtbl AS (SELECT xmltype ('<root>
<parent>
<item>
<item_detail>AAA</item_detail>
<item_amount>1000</item_amount>
</item>
<item>
<item_detail>BBB</item_detail>
<item_amount>2000</item_amount>
</item>
</parent>
</root>') AS xcol FROM dual)
SELECT xmlcast (
xmlquery ('root/parent/string-join[item/item_detail/text()]' PASSING xcol RETURNING CONTENT) AS VARCHAR2 (2000))
AS item_details
FROM xtbl;
请建议我如何修改XMLQuery。您仍然可以使用XMLTable调用:
SELECT x.*
FROM xtbl
CROSS JOIN xmltable('/root/parent/item'
PASSING xcol
COLUMNS item_detail VARCHAR2(10) path 'item_detail',
item_amount NUMBER path 'item_amount'
) x;
ITEM_DETAI ITEM_AMOUNT
---------- -----------
AAA 1000
BBB 2000
然后连接并聚合:
SELECT listagg(x.item_detail ||' '|| x.item_amount, ', ')
WITHIN GROUP (ORDER BY item_num) AS item_details
FROM xtbl
CROSS JOIN xmltable('/root/parent/item'
PASSING xcol
COLUMNS item_detail VARCHAR2(10) path 'item_detail',
item_amount NUMBER path 'item_amount',
item_num FOR ORDINALITY
) x;
ITEM_DETAILS
--------------------------------------------------
AAA 1000, BBB 2000
对于没有将只返回null的项的父级
但是,您也可以通过XMLQuery调用来实现这一点:
SELECT xmlquery(
'let $d :=
for $i in /root/parent/item
return concat($i/item_detail, " ", $i/item_amount)
return string-join($d, ", ")'
PASSING xcol
RETURNING CONTENT
) AS item_details
FROM xtbl;
ITEM_DETAILS
--------------------------------------------------
AAA 1000, BBB 2000
同样,对于没有返回null的项的父项
let$d:=
部分使用concat()
连接每个项目的详细信息和金额,并在它们之间留有空格。然后使用string-join()
聚合生成的所有$d
值
它返回一个XMLType,因此要以普通字符串的形式获得结果,您可以像在问题中一样使用XMLCast,或者更简单地使用.getStringVal()
:
您仍然可以使用XMLTable调用:
SELECT x.*
FROM xtbl
CROSS JOIN xmltable('/root/parent/item'
PASSING xcol
COLUMNS item_detail VARCHAR2(10) path 'item_detail',
item_amount NUMBER path 'item_amount'
) x;
ITEM_DETAI ITEM_AMOUNT
---------- -----------
AAA 1000
BBB 2000
然后连接并聚合:
SELECT listagg(x.item_detail ||' '|| x.item_amount, ', ')
WITHIN GROUP (ORDER BY item_num) AS item_details
FROM xtbl
CROSS JOIN xmltable('/root/parent/item'
PASSING xcol
COLUMNS item_detail VARCHAR2(10) path 'item_detail',
item_amount NUMBER path 'item_amount',
item_num FOR ORDINALITY
) x;
ITEM_DETAILS
--------------------------------------------------
AAA 1000, BBB 2000
对于没有将只返回null的项的父级
但是,您也可以通过XMLQuery调用来实现这一点:
SELECT xmlquery(
'let $d :=
for $i in /root/parent/item
return concat($i/item_detail, " ", $i/item_amount)
return string-join($d, ", ")'
PASSING xcol
RETURNING CONTENT
) AS item_details
FROM xtbl;
ITEM_DETAILS
--------------------------------------------------
AAA 1000, BBB 2000
同样,对于没有返回null的项的父项
let$d:=
部分使用concat()
连接每个项目的详细信息和金额,并在它们之间留有空格。然后使用string-join()
聚合生成的所有$d
值
它返回一个XMLType,因此要以普通字符串的形式获得结果,您可以像在问题中一样使用XMLCast,或者更简单地使用.getStringVal()
:
请解释你的答案。
*
在字符串连接((*)…
)中的意义是什么?已更新。请查看编辑。尝试更改每个字符串的分隔符-join()并进行测试。是否可以使用*
而不是仅使用*
来限定节点?如何操作?请解释您的答案。*
在字符串连接((*)…
)中的意义是什么?已更新。请查看编辑。尝试更改每个字符串的分隔符-连接()然后进行测试。是否有可能不使用*
,而是对节点进行鉴定?如何进行?
'string-join(/root/parent/item/string-join(
(item_detail, item_amount)
, " "
)
, ", "
)'