3

我在 SQL Server 数据库(SQL Server 2012)中有一个 XML 列,其结构如下:

<history>
    <status updatedAt="2013-11-30" active="true" />
    <status updatedAt="2013-11-15" active="false" />
    <status updatedAt="2012-05-10" active="true" />
    <status updatedAt="2012-01-30" active="true" />
</history>

较新的状态将作为顶部节点添加到列中。

我需要选择一个<status>节点子集,其中包括updatedAt属性小于或等于给定日期的第一个节点和所有前面的节点(或者,所有<status> 节点,直到updatedAt属性小于或等于给定日期)。

如何使用 XPath 实现这一点?

DECLARE @date DATE = '2012-30-10';
SELECT Statuses = Statuses.query('what should be there?')

现在我结束了这个查询:

SELECT Statuses = Statuses.query'((/history/pricing[@updatedAt <= sql:variable("@date")])[1])')

但它只返回第一个节点,我怎样才能包含它之前的所有兄弟姐妹呢?

4

1 回答 1

1

要获取所有前面的兄弟姐妹,请使用preceding-siblings轴并选择最后一个匹配<pricing/>标记之前的所有兄弟姐妹。

SELECT Statuses = Statuses.query('
  /history/pricing[
      @updatedAt <= sql:variable("@date") and last()
  ]/preceding-sibling::pricing')

顺便说一句,虽然您的示例数据有<status/>标签,但您的查询需要<pricing/>标签?


我忘记了 MS SQL Server 不支持该轴,但它支持节点顺序运算符<<,您可以使用它来解决这个问题。此查询表示“选择出现在具有此值的最后一个定价节点之前的所有定价节点”。

/history/pricing[. << (/history/pricing[@updatedAt <= "2012-30-10"])[last()]]

试试SQL Fiddle

于 2013-12-01T12:39:15.537 回答