1

考虑以下 XML 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Input Control="1234567890">
   <Patient>
      <AccountID>johnsmith@gmail.com</AccountID>
      <Name>
         <Title>Mr</Title>
         <First>John</First>
         <Middle>J</Middle>
         <Last>Smith</Last>
      </Name>
      <Addresses>
         <Address Type="Billing">
            <Line1>123 Main St</Line1>
            <Line2>Unit #1</Line2>
            <City>Anytown</City>
            <State>MD</State>
            <PostalCode>78470</PostalCode>
            <Country>USA</Country>
            <Zone>TR89</Zone>
         <Address Type="Contact">
            <Line1>55 Main St</Line1>
            <City>Anytown</City>
            <State>MD</State>
            <PostalCode>78470</PostalCode>
            <Country>USA</Country>
            <Zone>TR89</Zone>
         </Address>
      </Addresses>
      <Phones>
         <Phone Type="Daytime">555-221-2525</Phone>
         <Phone Type="Evening">555-355-1010</Phone>
      </Phones>
      <Selects>
         <Select Name="Current">0</Select>
      </Selects>
   </Patient>
</Input>  

我需要将 XML(使用 XPath/XQuery)“分解”到下表中:

  Account    Nam_Pr   Nam_Fst  Nam_Lst  Adrs1Main  Adrs2Main  CityMain ... 
     1        Mr.      John     Smith  123 Main St  Unit #1    Anytown

问题是,我需要使用来自 Address Type="Billing 元素的数据填充 AdrsMain 字段,前提是它存在于文件中。否则,AdrsMain 字段是从 Address Type="Contact" 元素填充的。如何我做到这一点?

4

1 回答 1

1

事实证明这比我想象的要难一些,所以我会继续回答这个消息。我不记得 xquery 需要我对 null 进行任何转换的属性,因为(我认为)返回的值已经为 null。因此,您可能需要将一些空字符串转换回 null。幸运的是,我发现了一个很酷的小操作符,叫做nullif.

但这里的想法。

create table docs ( id int primary key, xmlbit xml);

假设您的文档文件已添加,然后您可以执行

with things (BillingLine1,ContactLine1)  as
(
SELECT 
nullif(cast(xmlbit.query('data(/Input/Patient/Addresses/Address[@Type="Billing"]/Line1)') as varchar(100)),'') as BillingLine1,
nullif(cast(xmlbit.query('data(/Input/Patient/Addresses/Address[@Type="Contact"]/Line1)') as varchar(100)),'') as ContactLine1
from docs  
 )
select BillingLine1, ContactLine1, Coalesce(BillingLine1,  ContactLine1) as needed from things;

演示:http ://sqlfiddle.com/#!3/b3fbd/15

可能还有其他方法可以做到这一点。我有一种感觉,如果你真的想要,你可以在 xquery/xpath 语句中做所有事情,它甚至可能更有利,但我不确定。

编辑:请注意我将它们投射到的 varchars 的大小;您可能需要调整以适应。

于 2012-05-31T16:23:16.027 回答