通过SQL

时间:2017-09-27 16:09:28

标签: sql sql-server xml tsql xquery

是否可以编写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>

我的问题

如何构建查询以仅选择<UpdatedDefaultAddress>的值为&#39; True&#39;?

的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 - 我认为代码正在检查<UpdatedDefaultAddress>是否存在,而不是其中包含的值?

1 个答案:

答案 0 :(得分:2)

使用.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';

results = [out_func(curr_matrix) for curr_matrix in array_of_matrixes]

<强> Rextester Demo