У меня есть таблица T с двумя столбцами. Столбец A является столбцом varchar, а столбец B является столбцом XML.
Где-то внутри столбца B всегда есть следующий родительский тег: <Documents> ... </Documents>
. Внутри есть несколько <Document>...</Document>
потомков.
Я хотел бы получить набор результатов с двумя столбцами:
Столбец 1 должен содержать те же значения, что и столбец A; Столбец 2 должен содержать содержимое только одного <Document>...</Document>
. Кроме того, в столбце 2 должны быть только <Document>
s с атрибутом, равным 1, 2 или 3.
Например, Стартовая таблица T:
Column A | Column B
--------------------------------------------------------------------------
abc | <Documents><Document ID="1">Doc Foo</Document><Document ID="4">Doc Bar</Document></Documents>
def | <Documents><Document ID="2">Doc Foo2</Document><Document ID="3">Doc Bar2</Document></Documents>
Ожидаемый результат:
Column 1 | Column 2
-------------------------------------
abc |<Document ID="1">Doc Foo</Document>
def |<Document ID="2">Doc Foo2</Document>
def |<Document ID="3">Doc Bar2</Document>
Я могу получить ожидаемый результат следующим образом:
SELECT
[Column A] AS [Column 1]
,T2.c.query('.') AS [Column 2]
FROM T AS tbl
CROSS APPLY T.nodes('*/Documents/Document[@ID="1" or @ID="2" or @ID="3"]') AS T2(c)
Но когда условия фильтра становятся более сложными, он может выйти из-под контроля без регулярных выражений. Это не работает:
SELECT
[Column A] AS [Column 1]
,T2.c.query('.') AS [Column 2]
FROM T AS tbl
CROSS APPLY T.nodes('*/Documents/Document[@ID="[1-3]"]') AS T2(c)
Как заставить это работать?