如何转换存储在VARCHAR中的xml文本并使用XQUERY表达式进行选择

时间:2018-02-22 08:22:48

标签: sql db2

我将xml文档存储为VARCHAR列中的文本。我想将文本转换为XML文档,以便对文档执行XQUERY选择。

示例文档如下所示:

<a>
   <b foor="bar"/>
   <c/>
</a>

我的查询如下:

SELECT XMLQUERY('//c' PASSING 
  XMLCAST('<a><b foor="bar"/><c/></a>' AS XML)) 
FROM SYSIBM.sysdummy1

但是我没有返回一个元素,而是收到以下错误消息:

  

SQL错误[10507]:轴步骤中的上下文项必须是节点。 SQLCODE = -16012,SQLSTATE = 10507

我怎样才能让它发挥作用?

===========================================
更新#1: 以防任何人遇到同样的问题。至少在我的环境中,下面的查询有效,但不是返回匹配的xml节点的文本,而是只显示列为#34; [le]&#34;的列。我不得不把结果投到例如VARCHAR XMLCAST()将xml作为文本。所以我将Stavr00的查询改为:

SELECT 
    XMLCAST(XMLQUERY('string(/a/b/@foo)' PASSING X) AS VARCHAR(20)) 
FROM (
SELECT xmlparse('<a><b foo="bar"/><c/></a>')
FROM sysibm.sysdummy1
) AS X(X)

2 个答案:

答案 0 :(得分:1)

下面没有经过语法测试,但我建议使用XMLPARSE。它将字符串转换为XML,可以由XMLQUERY使用:

SELECT XMLQUERY('//c' PASSING 
        xmlparse(document '<a><b foor="bar"/><c/></a>'))
FROM sysibm.sysdummy1

那应该返回<c/>

答案 1 :(得分:1)

同意@data_henrik。但是,我建议使用CTE嵌套来仅解析XML一次:

SELECT 
    XMLQUERY('string(/a/b/@foo)' PASSING X) 
   ,XMLQUERY('//c' PASSING X)
FROM (
SELECT xmlparse('<a><b foo="bar"/><c/></a>')
FROM sysibm.sysdummy1
) AS X(X)