Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Najlepszy sposób na wyodrębnienie danych z xml za pomocą xquery

Znalazłem trochę brudne rozwiązanie:

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

Ideą rozwiązania jest najpierw wyodrębnienie tych kontaktów, które mają>=18, następnie wyodrębnienie tych, które mają 0

UPD:pomimo tego, że rozwiązanie zapewniło prawidłowe wyniki, jego koszt jest wysoki:~1000 w szacowanym planie wykonania



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak określić, co jest kompilowane w SQL Server

  2. Klucz obcy do wielu tabel

  3. Sprawdź, czy wiersz istnieje, w przeciwnym razie wstaw

  4. Jak znaleźć procedurę składowaną zawierającą <tekst>?

  5. Co to jest jednostka DTU w Azure SQL Database i jak określić, ile potrzebujemy