Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle XMLQuery-显示带有两个XML节点的逗号分隔列表_Oracle_Xpath_Oracle11g_Oracle Xml Db - Fatal编程技术网

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)
                                           , " "
                                          )
             , ", "
            )'