Я пытаюсь разобрать столбец XML и пытаюсь сделать две вещейSQL Server 2012: синтаксический анализ XML затем выбрать один из подузлов, а также CONCAT всех субов узлов
- перебирать несколько вложенных узлы узла и выбрать один узел на основе значения флага 1/0.
- объединить все дочерние узлы, чтобы создать одну совмещенную поле (разделителями)
Runnable блок кода - SQL Server 2012:
create table #temp (XMLData xml)
insert into #temp (XMLData)
values ('
<Report_Data>
<Report_Entry>
<IsActive>1</IsActive>
<PID>111</PID>
<Languages>
<Language>German</Language>
<speak>Y</speak>
<read>Y</read>
<write>Y</write>
</Languages>
<Languages>
<Language>Spanish</Language>
<speak>Y</speak>
<read>N</read>
<write>N</write>
</Languages>
<phone>
<PhoneNumber>(101)111-1111</PhoneNumber>
<PhoneType>Work</PhoneType>
<IsPrimary>1</IsPrimary>
</phone>
<phone>
<PhoneNumber>(101)111-2222</PhoneNumber>
<PhoneType>Mobile</PhoneType>
<IsPrimary>0</IsPrimary>
</phone>
</Report_Entry>
<Report_Entry>
<IsActive>1</IsActive>
<PID>222</PID>
<phone>
<PhoneNumber>(101)222-1111</PhoneNumber>
<PhoneType>Mobile</PhoneType>
<IsPrimary>0</IsPrimary>
</phone>
</Report_Entry>
<Report_Entry>
<IsActive>1</IsActive>
<PID>333</PID>
<phone>
<PhoneNumber>(101)333-1111</PhoneNumber>
<PhoneType>Phone</PhoneType>
<IsPrimary>0</IsPrimary>
</phone>
<phone>
<PhoneNumber>(101)333-2222</PhoneNumber>
<PhoneType>Mobile</PhoneType>
<IsPrimary>1</IsPrimary>
</phone>
<location>
<location-state>NY</location-state>
</location>
<location>
<location-state>DC</location-state>
</location>
</Report_Entry>
</Report_Data>
')
select
c.value('IsActive[1]','varchar(1)') as IsActive
, c.value('PID[1]','varchar(5)') as PID
, case when c.value('phone[1]/IsPrimary[1]','int') = 1 then c.value('phone[1]/PhoneNumber[1]','varchar(15)') end as PublicWorkPhone /** this condition needs to look at all sub nodes. this stops at the first one. **/
, c.value('location[1]','varchar(2)') as location
from
#temp
cross apply #temp.XMLData.nodes('/Report_Data/Report_Entry') as y(c)
drop table #temp
GO
Я получаю это:
IsActive PID PublicWorkPhone location
-------- ----- --------------- --------
1 111 (101)111-1111 NULL
1 222 NULL NULL
1 333 NULL NY
Однако, Мне нужно это:
IsActive PID PublicWorkPhone location
-------- ----- --------------- --------
1 111 (101)111-1111 NULL
1 222 NULL NULL
1 333 (101)333-2222 NY,DC
Для PID = 333 основным телефоном является (101)333-2222 и не равно нулю. Кроме того, место должно быть «NY, DC», а не только NY.
Я очень благодарен за любую помощь, которую вы могли бы предложить для достижения результата. Спасибо
Это хороший вопрос: сценарий сценариев с копированием, собственный результат, неправильный вывод, ожидаемый результат. +1 с моей стороны – Shnugo
@ Шнуго, спасибо! – sch