首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XQuery SQL语句无法获得正确的父/子值

XQuery SQL语句无法获得正确的父/子值
EN

Stack Overflow用户
提问于 2017-06-13 16:45:01
回答 1查看 32关注 0票数 0

XML:(假设XMLNAMESPACES已经设置为a和b)

代码语言:javascript
复制
<Layer1 xmlns="a">
  <Layer2 xmlns="b">
    <Layer3>
      <id>val1</id>
      <data>False</data>
    </Layer3>
    <Layer3>
      <id>val2</id>
      <data>True</data>
    </Layer3>
  </Layer2>
</Layer1>

我正在使用这个sql来尝试完成我的任务。

代码语言:javascript
复制
ITEM.value('(/a:Layer1/b:Layer2/b:Layer3)[1]', 'varchar(max)') AS ReturnValue

我要做的是只得到id='val2‘和data=' true’的真值。就像这样:

代码语言:javascript
复制
ITEM.value('(/a:Layer1/b:Layer2/b:Layer3[id="val2" and data="True"]/b:data)[0]', 'varchar(max)') AS ReturnValue

由于某种原因,上面的内容返回null。我认为这是语法错误。

在这个查询中,我希望从id和数据遵循条件的任何Layer3父节点以True的形式返回值。我很感谢您的帮助,并在此之前感谢您。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-13 16:55:22

从你的代码来看,这是Server.

您的XML为第一个节点定义了默认名称空间,为<Layer2>再次定义了一个默认名称空间。

这意味着,<Layer2>下面的所有元素都在这个新的默认名称空间中。

您的代码忽略了这里的名称空间( [id="val2" and data="True"] ),但我不太明白您到底想要实现什么.

代码语言:javascript
复制
DECLARE @ITEM XML=
N'<Layer1 xmlns="a">
  <Layer2 xmlns="b">
    <Layer3>
      <id>val1</id>
      <data>False</data>
    </Layer3>
    <Layer3>
      <id>val2</id>
      <data>True</data>
    </Layer3>
  </Layer2>
</Layer1>';

-此查询将在<data>中的<Layer3>下面找到"True“值,其中<id>为"val2":

代码语言:javascript
复制
WITH XMLNAMESPACES('a' AS a,'b' AS b)
SELECT @ITEM.value('(/a:Layer1/b:Layer2/b:Layer3[b:id="val2"]/b:data/text())[1]', 'varchar(max)');

您可以在每个名称之前使用一个*:来使用名称空间通配符:

代码语言:javascript
复制
SELECT @ITEM.value('(/*:Layer1/*:Layer2/*:Layer3[*:id="val2"]/*:data/text())[1]', 'varchar(max)');

另一种方法是像这样定义内部默认ns,这样可以节省一些输入:

代码语言:javascript
复制
WITH XMLNAMESPACES('a' AS a, DEFAULT 'b')
SELECT @ITEM.value('(/a:Layer1/Layer2/Layer3[id="val2"]/data/text())[1]', 'varchar(max)');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44527254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档