OracleXMLQuery-显示带有两个XML节点的逗号分隔列表



我有一个这样的查询-

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;

尽管上面指定的示例包含一个节点,但在我的实际问题中,并不是每个<parent>节点都包含一个<item>节点。因此,我无法使用这个答案中描述的XMLTable解决方案。

SELECT xmlcast(...查询是我在上面尝试过的,但它不起作用。我的预期输出是这个-

ITEM_DETAILS
------------------
AAA 1000, BBB 2000

请建议我如何修改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()连接每个项目的详细信息和金额,它们之间留有空格。然后使用CCD_ 7来聚合生成的所有CCD_。

这会返回一个XMLType,所以要将结果作为一个普通字符串,您可以像问题中那样使用XMLCast,或者更简单地使用.getStringVal():

SELECT xmlquery(
...
).getStringVal() AS item_details
FROM xtbl;
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 (
'string-join(/root/parent/item/string-join((*), " "), ", ")' 
PASSING xcol
RETURNING CONTENT) AS VARCHAR2 (2000)
)
AS item_details
FROM xtbl;

编辑:*没有什么特别之处。它是child::*的短手

内部字符串联接:/root/parent/item/string-join(child::*, " ")连接/root/parent/item的每个子元素的值(这里指的是<item_detail><item_amount>。分隔符是space

外部字符串联接,将每个内部字符串联接的结果与comma的限制器联接。

第2版:

'string-join(/root/parent/item/string-join(
(item_detail, item_amount)
, " "
)
, ", "
)' 

相关内容

  • 没有找到相关文章

最新更新