【问题标题】:T-SQL - select XML node values, or NULL if the nodes don't existT-SQL - 选择 XML 节点值,如果节点不存在,则选择 NULL
【发布时间】:2018-08-20 09:11:37
【问题描述】:

我有一个如下所示的 XML。到目前为止,如果 A 和 B 节点都在 XML 中,我可以轻松地映射它们的属性,即 type="A-type"type="B-type"

我遇到了<B> 节点可能不存在于 XML 中的情况,然后我也需要获取 <A> 节点属性,即type="A-type",但当前逻辑没有返回任何行。请帮助如何实现这一目标。

请注意<B> 可以在<A> 下出现任意次数,这就是我们必须使用路径Root/A/B 的原因。由于无法预测 <B> 的出现,我无法更改路径。

示例 1(存在<B>):

DECLARE @myXML XML = 
'<Root>
<A type="A-type">
<B type="B-type"></B>
</A>
</Root>'

SELECT 
  N.value('(../@type)[1]','VARCHAR(100)'), 
  N.value('(@type)[1]','VARCHAR(100)') 
FROM @myXML.nodes('Root/A/B') AS X(N)

示例 2(&lt;B&gt; 不存在):

DECLARE @myXML XML = 
'<Root>
<A type="A-type">
</A>
</Root>'

SELECT 
  N.value('(../@type)[1]','VARCHAR(100)'), 
  N.value('(@type)[1]','VARCHAR(100)') 
FROM @myXML.nodes('Root/A/B') AS X(N)

预期输出:

【问题讨论】:

    标签: sql sql-server xml tsql


    【解决方案1】:

    试试这个

    SELECT 
      x1.A.value('@type','VARCHAR(100)'), 
      x2.B.value('@type','VARCHAR(100)')
    FROM
      @myXML.nodes('/Root/A[1]') AS x1(A)
      OUTER APPLY @myXML.nodes('/Root/A[1]/B') AS x2(B)
    

    <Root>
      <A type="A-type">
        <B type="B-type 1"></B>
        <B type="B-type 2"></B>
        <B type="B-type 3"></B>
      </A>
    </Root>
    

    返回

    A型 B型 1 A型 B型 2 A型 B型 3

    <Root>
      <A type="A-type">
        <B type="B-type"></B>
      </A>
    </Root>
    

    返回

    A型 B型

    <Root>
      <A type="A-type">
      </A>
    </Root>
    

    返回

    A型空

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多