是否可以编写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;?
我当前的代码
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>
是否存在,而不是其中包含的值?
答案 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 强>