Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

Xquery के साथ xml से डेटा निकालने का सबसे अच्छा तरीका

मुझे थोड़ा गंदा समाधान मिला है:

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

समाधान का विचार पहले उन संपर्कों को निकालना है जो>=18 हैं, फिर उन संपर्कों को निकालें जिनकी आयु <18 है और अंत में उन संपर्कों को सेट करें जो -1

को प्रदान नहीं किए गए हैं।

UPD:इस तथ्य के बावजूद कि समाधान ने सही परिणाम प्रदान किए, इसकी लागत अधिक है:अनुमानित निष्पादन योजना में ~1000



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पिछले 8 सप्ताहों में से प्रत्येक के लिए कुल सक्रिय उपयोगकर्ताओं को समूहीकृत करना

  2. डेटा को जोड़ने के लिए टेबल पर लूप (कर्सर का उपयोग किए बिना)

  3. SQL सर्वर 2016 स्थापित करें

  4. MSSQL क्वेरी का उपयोग करके माता-पिता के सभी बच्चों को प्राप्त करना

  5. SQL सर्वर क्रॉस डेटाबेस उपनाम