sql >> Database >  >> RDS >> Sqlserver

Knoopvolgorde zoeken in XML-document in SQL Server

U kunt de position() . emuleren functie door het aantal zusterknooppunten te tellen dat aan elk knooppunt voorafgaat:

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)

Hier is de resultatenset:

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

Hoe het werkt:

  • De for $i in . clausule definieert een variabele met de naam $i die het huidige knooppunt bevat (. ). Dit is eigenlijk een hack om XQuery's gebrek aan een XSLT-achtige current() te omzeilen functie.
  • De ../* expressie selecteert alle broers en zussen (kinderen van de ouder) van het huidige knooppunt.
  • De [. << $i] predikaat filtert de lijst met broers en zussen naar de voorgaande (<< ) het huidige knooppunt ($i ).
  • Wij count() het aantal voorgaande broers en zussen en voeg vervolgens 1 toe om de positie te krijgen. Op die manier krijgt de eerste knoop (die geen eerdere broers en zussen heeft) een positie van 1.


  1. MONTHS_BETWEEN() Functie in Oracle

  2. Hoe unicode op te slaan in MySQL?

  3. hoe vervang de geaccentueerde letter in een varchar2-kolom in orakel

  4. Vind records uit de ene tabel die niet bestaan ​​in een andere