我正在尝试读取xml并将其存储在SQL server中。
DECLARE @xml XML
SET @xml =
'<report>
<personal>
<search>
<subject>
<name>SearchName</name>
</subject>
</search>
</personal>
<personal>
<search>
<subject>
<name>SearchName</name>
</subject>
</search>
<result>
<history>
<name>HistoryName</name>
</history>
</result>
</personal>
<personal>
<search>
<subject>
<name>SearchName</name>
</subject>
</search>
<result>
<history>
<dob>HistoryDOB</dob>
</history>
</result>
</personal>
</report>
'
我在这里尝试的是 - 选择名称但这里的条件是
如果<personal>
包含<result>
,请选择name
下的history/name
如果<personal>
不包含<result>
,请选择name
下的subject/name
如果<personal>
包含<result>
但是名称不存在,则输入null
我正在使用以下查询
SELECT
COALESCE(
A.Search.value('(result/history/name)[1]','varchar(max)'),
A.Search.value('(search/subject/name)[1]','varchar(max)')
) AS Name
FROM @xml.nodes('/report/personal') as A(Search)
它正在返回
SearchName
HistoryName
SearchName
但它在第三种情况下失败了。
答案 0 :(得分:1)
只需调整第二个HttpClient
调用,专门请求您指定的内容 - 对于没有values
的节点,您只需search/subject
:
result
结果:
SELECT
COALESCE(
A.Search.value('(result/history/name)[1]','varchar(max)'),
A.Search.value('(search[not(../result)]/subject/name)[1]','varchar(max)')
) AS Name
FROM @xml.nodes('/report/personal') as A(Search)
答案 1 :(得分:0)
如果<personal>
包含<result>
,您可以使用exist方法进行搜索。
使用它,您的算法可以直接转换为查询:
select
case
when A.Search.exist('result') = 1
then A.Search.value('(result/history/name)[1]','varchar(max)')
else A.Search.value('(search/subject/name)[1]','varchar(max)')
end as Name
FROM @xml.nodes('/report/personal') as A(Search)