【问题标题】:How to add condition to COALESCE while reading xml in Sql如何在 Sql 中读取 xml 时向 COALESCE 添加条件
【发布时间】:2015-07-24 12:29:39
【问题描述】:

我正在尝试读取 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>
    <personal>
       <search>
           <subject>
               <name>SearchName</name>
           </subject>
       </search>
       <result>
           <history>
              <dob>HistoryDOB</dob>
           </history>
       </result>
    </personal>
  </report>
'

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

  1. 如果&lt;personal&gt; 包含&lt;result&gt;,则选择history/name 下的name

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

  3. 如果 &lt;personal&gt; 包含 &lt;result&gt;BUT 名称不存在则输入 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

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

【问题讨论】:

    标签: sql-server xml xquery-sql


    【解决方案1】:

    只需调整第二个 values 调用以明确请求您指定的内容 - 您只会为没有 result 的节点使用 search/subject

    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)
    

    结果:

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

    【讨论】:

      【解决方案2】:

      您可以使用exist 方法来检查&lt;personal&gt; 是否包含&lt;result&gt;

      使用它,您的算法可以直接转换为查询:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        • 2017-01-21
        相关资源
        最近更新 更多