Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách tốt nhất để trích xuất dữ liệu từ xml với xquery

Tôi đã tìm thấy một giải pháp hơi bẩn:

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

Ý tưởng của giải pháp là trước tiên trích xuất những địa chỉ liên hệ> =18, sau đó trích xuất những địa chỉ liên hệ 0

UPD:mặc dù thực tế là giải pháp cung cấp kết quả chính xác nhưng chi phí của nó cao:~ 1000 trong kế hoạch thực hiện ước tính



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlDataSourceEnumerator.Instance.GetDataSources () không định vị phiên bản SQL server 2008 cục bộ

  2. SQL Server 2008 Tìm kiếm toàn văn bản - CHẬM

  3. Ưu đãi lớn:SQL Server 2016 gói dịch vụ 1

  4. Bắt đầu với GearHost để phát triển cơ sở dữ liệu máy chủ SQL

  5. Bộ xử lý AMD EPYC 7002 Series và Máy chủ SQL