sql >> Database teknologi >  >> RDS >> Sqlserver

Den bedste måde at udtrække data fra xml med xquery

Jeg har fundet en lidt beskidt løsning:

select ISNULL(Age1, case when Num>= 1 then 18 else -1 end) Age1
    , ISNULL(Age2, case when Num>= 2 then 18 else -1 end) Age2
    , ISNULL(Age3, case when Num>= 3 then 18 else -1 end) Age3
    , ISNULL(Age4, case when Num>= 4 then 18 else -1 end) Age4
from (
    select Persons.Person.value('@num','smallint') as Num
          ,Persons.Person.value('xs:integer(fn:number(@num))+1','int') as Num1
          ,Persons.Person.value('Person[@age<18][xs:integer(fn:number(../@num))][1]/@age','smallint') as Age1
          ,Persons.Person.value('Person[@age<18][xs:integer(fn:number(../@num))-1][1]/@age','smallint') as Age2
          ,Persons.Person.value('Person[@age<18][xs:integer(fn:number(../@num))-2][1]/@age','smallint') as Age3
          ,Persons.Person.value('Person[@age<18][xs:integer(fn:number(../@num))-3][1]/@age','smallint') as Age4 
    from @XmlData.nodes('/Persons') Persons(Person)
 ) Persons

Ideen med en løsning er først at udtrække de kontakter, der er>=18, derefter udtrække dem, der er 0

UPD:på trods af at løsningen gav korrekte resultater, er dens omkostninger høje:~1000 i estimeret udførelsesplan



  1. Databasedesign:EAV-muligheder?

  2. mysql parametriseret forespørgsel i ASP.NET

  3. Hvordan afkorter man en tabel ved hjælp af forberedt sætning i MySQL?

  4. Tjek begrænsning i SQL