2017-02-02 6 views
1

私はバージョンPostgreSQL 8.3.12を使用しています。列XMLデータを行に変換

表の列名:

<?xml version="1.0" encoding="utf-8"?> 
<ItemData> 
    <ReviewComments>&lt;?xml version="1.0" encoding="utf-8"?&gt; 
    </ReviewComments> 
    <SmartTextData RootProtect="True"> 
     <STI_Summary IID="d10c5cbf-f5cf-4478-9f33-4580c1930413" IR="True"> 
      <ObjectValue /> 
      <CP /> 
      <SIProps ST="4" PL="False" PLS="" /> 
      <STI_SummaryActiveProblemsField LIID="cdbd7044-ccde-11db-8cba-df0a56d89593" IID="37742a5f-7998-4715-8d43-0d7a19284d44" IR="True" RW="1"> 
      <HD Title="Active Problems" /> 
      <ObjectValue /> 
      <CP> 
       <PosReplace /> 
       <NegReplace /> 
      </CP> 
      <SIProps ST="4" PL="False" PLS="" /> 
      <STI_US> 
       <ObjectValue> 
        <TextValue> 
         <![CDATA[ 
]]> 
        </TextValue> 
       </ObjectValue> 
       <CP /> 
       <SIProps ST="1" SS=" " PL="False" PLS="" /> 
      </STI_US> 
      <STI_DxItem LIID="71194038-8ffb-488b-8af5-5f1f1a679115" IID="aaf2de4e-2f1f-409b-87b7-b7265bec37db" RW="1"> 
       <HD Title="Coronary artery disease " /> 
       <ObjectValue> 
        <Code> 
         <CodingSystem>ICD-9 CM</CodingSystem> 
         <Value>414.01</Value> 
        </Code> 
        <Code> 
         <CodingSystem>SWICPC</CodingSystem> 
         <Value>08.0.K76.CIR</Value> 
        </Code> 
       </ObjectValue> 
      </STI_DxItem > 
     </STI_Summary> 
    </SmartTextData> 
</ItemData> 

私はそれぞれのID列にXMLタグIIDとCODEデータをこぼしたい:た[XMLTest

iddata

Data列は、このようなXMLデータが含まれています。

予想される出力:

  ID LIID           Code_Value CodingSystem 
      1 d10c5cbf-f5cf-4478-9f33-4580c1930413  NULL 
      1 37742a5f-7998-4715-8d43-0d7a19284d44  NULL 
      1 aaf2de4e-2f1f-409b-87b7-b7265bec37db  414.01   IC CM 
      1 aaf2de4e-2f1f-409b-87b7-b7265bec37db  08.0.K76.CIR SWICPC 

注:私は動作しないXMLPATHのこのいくつかの新しい構文でバージョンのPostgreSQL 8.3.12を使用しています。

XMLデータを行の列構造に変換したいだけです。

これをお読みいただきありがとうございます。

+0

ファイルを検証することができない、行方不明タグ.httpがあります://www.xmlvalidation.com/ – McNets

+0

あなたのXMLが正しくバランスがとれていないで、 'STI_DxItem'ではありません閉まっている。 – jcaron

+0

@jcaronコードが編集されました。 LLIDはすべてここにあふれています。 –

答えて

0

SOの質問を見て、私はこれを見つけた:

ERROR: function unnest(integer[]) does not exist in postgresql

この質問の解決法によれば、あなたはこのように一次元アレイで、あなた自身でunnestを実装することができます。

CREATE OR REPLACE FUNCTION unnest2(anyarray) 
    RETURNS SETOF anyelement AS 
$BODY$ 
    SELECT $1[i] FROM generate_series(array_lower($1,1), array_upper($1,1)) i; 
$BODY$ LANGUAGE sql IMMUTABLE; 

この関数は、次の文を使用してデータを照会できるようにする必要があります。

SELECT xpath('/ItemData/SmartTextData/STI_Summary/STI_DxItem/@IID', data, array[array['aaa','example.com']]) as IID, 
     unnest2(xpath('/ItemData/SmartTextData/STI_Summary/ObjectValue/Code/CodingSystem/text()', data, array[array['aaa','example.com']])) as Code, 
     unnest2(xpath('/ItemData/SmartTextData/STI_Summary/ObjectValue/Code/Value/text()', data, array[array['aaa','example.com']])) as Value 
from xmltest2; 

XMLデータにスキーマがないため、コメントに指摘したとおり、array[array['aaa','example.com']]を使用しました。

私はrextesterでテストしています。

+--------------------------------------+----------+--------------+ 
|     iid     | code | value  | 
+--------------------------------------+----------+--------------+ 
| aaf2de4e-2f1f-409b-87b7-b7265bec37db | ICD-9 CM | 414.01  | 
+--------------------------------------+----------+--------------+ 
| aaf2de4e-2f1f-409b-87b7-b7265bec37db | SWICPC | 08.0.K76.CIR | 
+--------------------------------------+----------+--------------+ 

ここでそれを確認してください:Rextester

+0

8.3 vesrion .Thnk on the wokring on help。しかし、ここでLIIDを見つけるための他の方法はありますか? –

+0

but unnest does not – McNets

+0

エラー '不明な関数Xpath' –

関連する問題