sql >> データベース >  >> RDS >> Sqlserver

SQLServerのXMLドキュメントでノードの順序を検索する

    position()をエミュレートできます 各ノードの前にある兄弟ノードの数を数えることで機能します:

    SELECT
        code = value.value('@code', 'int'),
        parent_code = value.value('../@code', 'int'),
        ord = value.value('for $i in . return count(../*[. << $i]) + 1', 'int')
    FROM @Xml.nodes('//value') AS T(value)
    

    結果セットは次のとおりです。

    code   parent_code  ord
    ----   -----------  ---
    1      NULL         1
    11     1            1
    111    11           1
    12     1            2
    121    12           1
    1211   121          1
    1212   121          2
    

    仕組み:

    • $iのfor $i in . 句は、$iという名前の変数を定義します 現在のノード(for $i in . )。これは基本的に、XQueryにXSLTのようなcurrent()がないことを回避するためのハックです。 機能。
    • ../* 式は、現在のノードのすべての兄弟(親の子)を選択します。
    • [. << $i] 述語は、兄弟のリストを前の兄弟のリストにフィルターします(<< )現在のノード($i
    • count() 先行する兄弟の数を入力し、1を加算して位置を取得します。このようにして、最初のノード(先行する兄弟がない)に1の位置が割り当てられます。


    1. Oracle / SQL:クエリSELECT*FROMレコードWHERErownum>=5 AND rownum<=10-ゼロ行を返すのはなぜですか

    2. Postgres配列へのデータの選択

    3. カスタムORDERBY説明

    4. MySQL ATAN2()関数–2つの値のアークタンジェントを返します