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

問題は、ファイルに存在する場合にのみ、AdrsMain フィールドに Address Type="Billing 要素からのデータを入力する必要があることです。それ以外の場合、AdrsMain フィールドは Address Type="Contact" 要素から入力されます。私はこれを達成しますか?

4

1 に答える 1

1

想像していたよりも少し難しかったので、このメッセージにお答えします。返された値がすでにnullだったので(私は思った)、nullへの変換を必要とする属性からのxqueryを思い出しません。このため、一部の空の文字列を 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 ステートメント内ですべてを行うことができ、さらに有利になる可能性があると思いますが、よくわかりません。

編集:キャストしたvarcharのサイズに注意してください。適合するように調整する必要がある場合があります。

于 2012-05-31T16:23:16.027 に答える