У меня есть следующие данные XML, которые я не контролирую.Обратите внимание, что это в основном коллекция групп свойств.Мне нужно выбрать значение одного свойства, где значение другого свойства равно «true».Проблема в том, что сгруппировать нечего, и я не могу понять, как правильно связать вещи.
Вот данные XML и запрос, который я до сих пор задавал:
DECLARE @xml xml = '
<Container>
<Collection>
<ItemName>SomeItem</ItemName>
<IsDeletable>true</IsDeletable>
<IsPersisted>false</IsPersisted>
</Collection>
<Collection>
<ItemName>AnotherItem</ItemName>
<IsDeletable>true</IsDeletable>
<IsPersisted>true</IsPersisted>
<ExistsInDB>true</ExistsInDB>
</Collection>
<Collection>
<ItemName>ItemFoo</ItemName>
<IsDeletable>true</IsDeletable>
<IsPersisted>true</IsPersisted>
<ExistsInDB>true</ExistsInDB>
</Collection>
<Collection>
<ItemName>BarBazItem</ItemName>
<IsDeletable>true</IsDeletable>
<IsPersisted>true</IsPersisted>
<ExistsInDB>false</ExistsInDB>
</Collection>
</Container>
'
;WITH XmlStuff AS (
SELECT CAST(xmlShredded.colXmlItem.query('local-name(.)') AS nvarchar(4000)) as XmlNodeName,
xmlShredded.colXmlItem.value('.', 'nvarchar(4000)') AS XmlNodeValue
FROM @xml.nodes('/*/Collection/child::node()') as xmlShredded(colXmlItem)
)
SELECT *
FROM XmlStuff
Теперь мне нужно получить значение «ItemName» для каждой группы, где «ExistsInDB» равно «true».Обратите внимание, что свойство «ExistsInDB» не существует в первой коллекции свойств (т. Е. Его следует рассматривать как NULL / false).
Так что в этом случае мне нужно запросить эти данные XML и получить обратноследующий набор:
AnotherItem ItemFoo
Я не должен получать "SomeItem" или "BarBazItem".
Я бился головой о стол, пытаясь понять, каксформулировать запрос для «Получить все значения ItemName, если соответствующее значение ExistsInDB присутствует и истинно».
Возможно ли это вообще?