У меня есть следующее XML.
<XML>
<Data>
<Outer>
<Inner>123ABC</Inner>
</Outer>
<Outer>
<Inner>123</Inner>
</Outer>
<Outer>
<Inner>-123</Inner>
</Outer>
</Data>
</XML>
Я хочу выбрать содержимое узла <Inner>
, но только если это не число c. Или другими словами: я хочу выбрать его, только если он содержит хотя бы один символ. Таким образом, результат должен быть только 123ABC
.
Мой код SQL в настоящее время выглядит следующим образом.
DECLARE @string NVARCHAR(MAX);
DECLARE @xml XML;
SET @string =
'<XML><Data><Outer><Inner>123ABC</Inner></Outer><Outer><Inner>-123</Inner></Outer><Outer><Inner>123</Inner></Outer></Data></XML>';
SET @xml = @string;
SELECT @xml;
SELECT h.value('text()[1]', 'nvarchar(max)')
FROM @xml.nodes('XML') AS Statements(nodes)
OUTER APPLY @xml.nodes('Data/Outer/Inner') AS Data(h)
Запрос выбирает все узлы, то есть 123ABC
, -123
и 123
. Однако я хочу только выбрать 123ABC
. Чтобы это работало с моим реальным примером, мне нужно изменить строку OUTER APPLY
:
OUTER APPLY @xml.nodes('Data/Outer/Inner') AS Data(h)
Я почти уверен, что моя цель может быть достигнута путем применения фильтра следующим образом.
@xml.nodes('Data/Outer/Inner[FILTER]')
Однако я не смог найти ничего работающего.
ОБНОВЛЕНИЕ: Критерий фильтра можно сформулировать более подробно следующим образом. Должны быть показаны только те элементы, которые содержат хотя бы одну букву. Таким образом, следующие значения не должны отображаться, например: -1,5, 1,5, -33