मुझे थोड़ा गंदा समाधान मिला है:
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