【问题标题】:Querying XML Child Nodes with WHERE clause via SQL通过 SQL 使用 WHERE 子句查询 XML 子节点
【发布时间】:2017-09-27 16:09:27
【问题描述】:

是否可以编写 WHERE 子句根据子节点的值从 XML 中选择值?

示例 XML

<Message>
   <PrimaryKeyValue>12345</PrimaryKeyValue>
   <Events>
      <UpdatedDefaultAddress>True</UpdatedDefaultAddress>
      <UpdatedCustomerName>False</UpdatedCustomerName>
   </Events>
</Message>
<Message>
   <PrimaryKeyValue>67890</PrimaryKeyValue>
   <Events>
      <UpdatedDefaultAddress>False</UpdatedDefaultAddress>
      <UpdatedCustomerName>True</UpdatedCustomerName>
   </Events>
</Message>

我的问题

如何构造一个查询以仅选择 &lt;UpdatedDefaultAddress&gt; 的值为“True”的 PrimaryKeyValues?

我当前的代码

SELECT
t.c.value('(PrimaryKeyValue)[1]', 'varchar(100)') AS PrimaryKeyValue
FROM @message_body.nodes('Message') as T(C)
WHERE t.c.exist('./Events/UpdateDefaultAddress') = 'True'

问题在于我在结果中返回了两个 PrimaryKeyValues - 我认为代码是检查 &lt;UpdatedDefaultAddress&gt; 是否存在,而不是其中包含的值?

【问题讨论】:

    标签: sql sql-server xml tsql xquery


    【解决方案1】:

    使用.value() 而不是.exists()

    DECLARE @message_body XML =N'<Message>
       <PrimaryKeyValue>12345</PrimaryKeyValue>
       <Events>
          <UpdatedDefaultAddress>True</UpdatedDefaultAddress>
          <UpdatedCustomerName>False</UpdatedCustomerName>
       </Events>
    </Message>
    <Message>
       <PrimaryKeyValue>67890</PrimaryKeyValue>
       <Events>
          <UpdatedDefaultAddress>False</UpdatedDefaultAddress>
          <UpdatedCustomerName>True</UpdatedCustomerName>
       </Events>
    </Message>';
    
    SELECT t.c.value('(PrimaryKeyValue)[1]', 'varchar(100)') AS PrimaryKeyValue
    FROM @message_body.nodes('Message') as T(C)
    WHERE  t.c.value('(./Events/UpdatedDefaultAddress)[1]', 'varchar(10)')='True';
    

    Rextester Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多