Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara terbaik untuk mengekstrak data dari xml dengan xquery

Saya telah menemukan solusi yang sedikit kotor:

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 solusinya adalah pertama-tama ekstrak kontak yang>=18, lalu ekstrak yang 0

UPD:terlepas dari kenyataan bahwa solusi memberikan hasil yang benar, biayanya tinggi:~1000 dalam perkiraan rencana eksekusi



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghubungkan ke server SQL dari komputer lain

  2. Cara mendapatkan Catatan Berbeda dari tabel di SQL Server - Tutorial SQL Server / TSQL 112

  3. Periksa apakah ada file atau tidak di sql server?

  4. Kesalahan sintaks SQL 2008 R2 CTE dalam pernyataan SELECT

  5. Ikhtisar Kompresi Data di SQL Server