2017-01-30 12 views
0

clobフィールドを持つOracleデータベースがあります。フィールドのデータは次のようになります(これはclobの1行のデータです)。私は、単一の線として電子メールアドレスを抽出するために、そうれる好ましい出力は[email protected]なり、[email protected][email protected][email protected]、esa9必要clobから複数のフィールドを抽出

outputLocale;runOptionEnum;runOptionLanguageArray;123;<value xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[1]">{CR}{LF} 
{>>}<item xsi:type="xsd:string">en-us</item>{CR}{LF} 
</value>{CR}{LF} 
ccAddress;deliveryOptionEnum;deliveryOptionAddressSMTPArray;207;<value xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="bus:addressSMTP[2]">{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
</value>{CR}{LF} 
toAddress;deliveryOptionEnum;deliveryOptionAddressSMTPArray;271;<value xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="bus:addressSMTP[3]">{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
</value>{CR}{LF} 

@ blah.nlなど。いくつかの行は、1つのメールアドレスを持っているし、他の人は、私が最初にSUBSTRおよびINSTR関数を使用して、フィールドを見つけることを試みた10

を持っているが、私はこれを行うための簡単な方法があると思います。データはXMLのように見えるかもしれませんが、最終的にはそうではありません。したがって、xmlのOracleオプションは機能していないようです。

+1

」要素の前に '{CR} {LF}'と ';'で区切られた文字列を取り除きます。次に、XMLとして処理できるように見えます。 – MT0

+0

おそらく、これらのフィールドを取り除くのは簡単ではありません。なぜなら、outputLocale; runOptionEnum; runOptionLanguageArray; 123パートはclob .. –

+0

'SELECT REGEXP_REPLACE(clob_field、 '(^ |)の可変長です。 *?($ | MT0

答えて

1

ラップをXML要素内のテキスト、その後、ちょうどXMLとしてそれを解析:

Oracleのセットアップ

CREATE TABLE table_name (id INT, clob_field CLOB); 

INSERT INTO table_name (
    id, clob_field 
) VALUES (
    1, 'outputLocale;runOptionEnum;runOptionLanguageArray;123;<value xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[1]">{CR}{LF} 
{>>}<item xsi:type="xsd:string">en-us</item>{CR}{LF} 
</value>{CR}{LF} 
ccAddress;deliveryOptionEnum;deliveryOptionAddressSMTPArray;207;<value xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="bus:addressSMTP[2]">{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
</value>{CR}{LF} 
toAddress;deliveryOptionEnum;deliveryOptionAddressSMTPArray;271;<value xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="bus:addressSMTP[3]">{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
{>>}<item xsi:type="bus:addressSMTP">[email protected]</item>{CR}{LF} 
</value>{CR}{LF}' 
); 

クエリ

SELECT t.id, 
     LISTAGG(x.address, ',') WITHIN GROUP (ORDER BY ROWNUM) AS addresses 
FROM table_name t 
     CROSS JOIN 
     XMLTABLE(
     '/SOAP-ENC/value/item[@xsi:type="bus:addressSMTP"]' 
     PASSING XMLType(
      '<?xml version="1.0" encoding="utf-8"?> 
      <SOAP-ENC xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">' 
      || t.clob_field 
      || '</SOAP-ENC>' 
     ) 
     COLUMNS address VARCHAR2(200) PATH 'text()' 
     ) x 
GROUP BY t.id; 

出力

ID ADDRESSES 
-- ------------------------------------------------------------------------ 
1 [email protected],[email protected],[email protected],[email protected],[email protected] 
+0

優れています。これから私は続けることができます! –

関連する問題