T-SQL-选择XML节点值,如果节点不存在,则选择NULL

时间:2018-08-20 09:11:38

标签: sql sql-server xml tsql

我有一个如下所示的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)

Result Example 1

示例2(不存在<B>

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)

Result Example 2

预期输出:

Expected Result

1 个答案:

答案 0 :(得分:3)

尝试一下

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-type  B-type 1
A-type  B-type 2
A-type  B-type 3

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

它返回

A-type  B-type

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

它返回

A-type  NULL