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<statusupdatedAt

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 に答える