如何在Sql中读取xml时向COALESCE添加条件

时间:2015-07-24 12:29:39

标签: sql-server xml xquery-sql

我正在尝试读取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>
'

我在这里尝试的是 - 选择名称但这里的条件是

  1. 如果<personal>包含<result>,请选择name下的history/name

  2. 如果<personal>不包含<result>,请选择name下的subject/name

  3. 如果<personal>包含<result>但是名称不存在,则输入null

  4. 我正在使用以下查询

    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
    

    但它在第三种情况下失败了。

2 个答案:

答案 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)