2017-09-27 27 views
1

子ノードの値に基づいてXMLから値を選択するWHERE句を記述できますか?SQL経由で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>の値が '本当' である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>が存在するかどうかをチェックしていると思いますか?

答えて

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'; 

Rextester Demo

の使用 .value()
関連する問題