【问题标题】:If condition on Selecting XML node in SQL如果在 SQL 中选择 XML 节点的条件
【发布时间】:2015-07-23 23:50:37
【问题描述】:

我正在尝试读取 xml 并将其存储在 SQL 服务器中。

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>
  </report>
'

我在这里尝试的是 - 选择名称但这里的条件是 如果&lt;personal&gt; 包含&lt;result&gt; 则选择history/name 下的name

如果&lt;personal&gt; 不包含&lt;result&gt;,请选择subject/name 下的name

目前我正在从个人/主题中选择名称,如下所示:

Select 
A.Search.value('(subject/name)[1]','varchar(max)')
FROM  @xml.nodes('/report/personal/search') as A(Search)

预期结果:

SearchName
HistoryName

如何在两者之间添加条件?

有什么办法可以在这里添加存在条件

 SELECT @xml.exist('//report//personal//search//subject//name')

【问题讨论】:

    标签: sql-server xml xquery-sql


    【解决方案1】:
    Select coalesce(A.Search.value('(result/history/name)[1]', 'varchar(max)'), A.Search.value('(search/subject/name)[1]','varchar(max)'))
    FROM @xml.nodes('/report/personal') as A(Search)
    

    【讨论】:

    • 它返回 SearchName 但我想在单个查询中同时获取 SearchName 和 HistoryName
    • 是的,这就是我要找的。谢谢你:)
    【解决方案2】:

    这个:

    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)
    

    将返回:

    Name
    ------------
    SearchName
    HistoryName
    

    【讨论】:

    • @user1893874 乐于助人:)
    猜你喜欢
    • 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
    相关资源
    最近更新 更多