使用 XPath/XQuery 过滤 XML 列上的 SQL 查询

Posted

技术标签:

【中文标题】使用 XPath/XQuery 过滤 XML 列上的 SQL 查询【英文标题】:Filter SQL queries on the XML column using XPath/XQuery 【发布时间】:2010-12-16 08:14:30 【问题描述】:

我有一个包含一个 XML 列的表。我想过滤掉 XML 中特定属性与字符串匹配的行,本质上是在执行 WHERE 或 HAVING。

表格看起来像这样

| id | xml |

和 XML 类似的东西

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

我想获取所有 @name 属性匹配值的 id。

我已经能够做到以下几点:

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

但速度非常慢。

必须有更好的过滤查询输出的方法。

【问题讨论】:

如果您还没有这样做,我还建议您确保您的 XML 列上有索引。 >XML Indexes Overview (SQLServerPedia.com) 【参考方案1】:

找到了。而不是使用 query() 我应该使用exist()。

我的查询将是

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

【讨论】:

以上是关于使用 XPath/XQuery 过滤 XML 列上的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

XPath / XQuery:在节点中查找文本,但忽略特定后代元素的内容

SQL Server XML 列上的 Where 子句过滤属性 AND 值

使用 Pandas query() 过滤时间戳列上的数据帧

如何强制 Kendo Grid 在列上使用数字过滤器

在一列上设置过滤器和提供的过滤器 - Ag-Grid

在 Oracle DBMS 中的多个列上使用过滤条件连接表