次のxmlを検討してください。
<Persons num="3">
<Person age="5" />
<Person age="19" />
</Persons>
このxmlをリレーショナルテーブルに抽出する必要があります。
Persons table (Age1 int, Age2 int, Age3 int , Age4 int)
構文解析は、次の制約を満たす必要があります。
- 18歳以上のすべての人は、列番号が最小の列に割り当てられ、値は18である必要があります。
- その人の年齢が与えられていない場合、それは18に等しい
- 18歳未満のすべての人は従う必要があります
- 4人未満の場合、提供されない人は年齢=-1でなければなりません
与えられた例では、3人がいて、そのうちの2人の年齢が提供されています:それぞれ5歳と19歳。テーブルPersonsの内容は次のとおりである必要があります。
18 18 5 -1
xpathを使用してこれを行うための最良の方法はありますか?
今まで私はxmlを解析して年齢を割り当てることができますが、明確ではないのは順序付けの方法です。
declare @XmlData xml =
'<Persons num="3">
<Person age="5" />
<Person age="19" />
</Persons>'
declare @Persons table (Age1 int, Age2 int, Age3 int , Age4 int)
insert into @Persons (Age1, Age2, Age3, Age4)
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('Person[@age<18][1]/@age','smallint') as Age1
,Persons.Person.value('Person[@age<18][2]/@age','smallint') as Age2
,Persons.Person.value('Person[@age<18][3]/@age','smallint') as Age3
,Persons.Person.value('Person[@age<18][4]/@age','smallint') as Age4
from @XmlData.nodes('/Persons') Persons(Person)
) Persons
select *
from @Persons
結果は
5 18 18 -1