2017-09-27 7 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

사용 .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