Фильтрация запросов SQL в столбце XML с использованием XPath / XQuery - PullRequest
10 голосов
/ 13 ноября 2009

У меня есть таблица с одним столбцом XML. Я хотел бы отфильтровать строки, в которых определенный атрибут в XML совпадает со строкой, по сути, делая WHERE или HAVING.

Таблица выглядит примерно так

| id | xml |

А XML что-то похожее на

<xml>
  <info name="Foo">
    <data .../>
  </info>
<xml>

Я хочу получить все идентификаторы, в которых атрибут @name соответствует значению.

Мне удалось сделать следующее:

SELECT id, xml.query('data(/xml/info/@name)') as Value
FROM Table1
WHERE CAST(xml.query('data(/xml/info/@name)') as varchar(1024)) = @match

Но это невероятно медленно.

Должен быть лучший способ фильтрации выходных данных запроса.

1 Ответ

21 голосов
/ 13 ноября 2009

Нашел это. Вместо использования query () я должен использовать exist () .

Тогда мой запрос будет

SELECT id, xml.query('data(/xml/info/@name)') as Value
FROM Table1
WHERE xml.exist('/xml/info/[@name=sql:variable("@match")]') = 1
...