Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Най-добрият начин за извличане на данни от xml с xquery

Намерих малко мръсно решение:

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, след това тези, които са 0 <възраст <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. Изпълнете SQL съхранена процедура и обработете резултатите

  2. Връщане на информация за колона от свързан сървър в SQL Server (T-SQL примери)

  3. T-SQL за намиране на име на отдалечен сървър на свързания сървър

  4. Как да използвате функциите на SQL Server AlwaysOn

  5. Има ли функция за линейна регресия в SQL Server?