2017-07-04 9 views
2

1つの列(Idx)に基づいて出力を特定の形式で返す必要があるという要件が1つあります。 1つの列には、ループを実行する日付範囲があります。Oracle特定の形式の文字列を返す方法

drop table t_table_test; 
create table t_table_test (ID NUMBER, NM VARCHAR2(4000), VAL VARCHAR2(4000), IDX NUMBER); 
select * from t_table_test; 
INSERT INTO t_table_test VALUES (1,'CNTRY', 'USA',1); 
INSERT INTO t_table_test VALUES (1,'DT', '2017-01-01,2017-01-02',2); 
INSERT INTO t_table_test VALUES (1,'PART', 'NA',3); 

入力が

ID NM   VAL     IDX 
1 CNTRY  USA     1 
1 DT  2017-01-01,2017-01-02 2 
1 PART  NA     3 

出力を下回っている場合は、このIDX欄

ID NM  VAL     IDX 
1 DT  2017-01-01,2017-01-02 1 
1 CNTRY  USA     2 
1 PART  NA     3 

DT:2017-01-01,CNTRY:USA,PART:NA?DT:2017-01-02,CNTRY:USA,PART:NA 

はWHERE IDX t_table_test。DELETE FROM

CNTRY:USA,DT:2017-01-01,PART:NA?CNTRY:USA,DT:2017-01-02,PART:NA 

I/Pに基づいて行われますする必要があります= 3; コミット。 O/P DT:2017-01-01、CNTRY:USA?DT:2017-01-02、CNTRY:USA t_table_testから削除する場所idx = 1; コミット。 O/P DT:2017-01-01?DT:2017-01-02 上記のすべてのケースで機能するクエリが必要です。

+0

ただ明白です:複数のレコードのVAL列に複数の値が含まれるとどうなりますか?たとえば、NM = CNTRY、VALUE = USAの場合、CANADAとIDX = 1、NM = DT、VAL = 2017-01-01,2017-01-02、IDX = 2の場合は、 – Assafs

+0

ありがとうございました複数の値はDTのためだけにあります。他の列には複数のエントリがありません。 – Vikas

答えて

0

おそらく、あなたはこれを試すことができます。

select rtrim(XMLAGG(XMLELEMENT(E,val||'?')).EXTRACT('//text()'),',') from (
with dates as (SELECT distinct NM||':'||trim(regexp_substr(val, '[^,]+', 1, level)) val 
from t_table_test where nm='DT' CONNECT BY instr(val, ',', 1, level - 1) > 0), 
parts as (select NM||':'||VAL val FROM t_table_test where nm='PART') 
SELECT NM||':'||t.VAL||','||d.VAL||','||p.val val from t_table_test t, dates d, parts p 
where NM='CNTRY'); 

それは固定されている名前に依存しない - 例えば、唯一のDTは、値のカンマ区切りリストされた - しかし、私はそれはあなたがあなたの結果をフォーマット役立つかもしれないと思います。これを使って、多くの同様の書式設定ソリューションを構築することができます。

+0

実際にここで問題となるのは、NM値が固定されていないことです。それは何でもかまいませんし、DTは3日間有効な範囲です01-01-2017,02-01-2017,03-01-2017またDTが2つ以上の値を持つ – Vikas

+0

は、与えられた解では問題ありません。 NMがCNTRYとPART以外の値を持つこともOKです - 値を知ることができますか、まったく不明なソースから選択していますか? – Assafs

+0

はいあなたは正しいですより多くの値はここで問題ではありません。要件はいつか私はそのIDのための唯一の列を持っています。 1列の場合はcol_NM:COL_VLを返します。複数のvlaueがIDX列を使用していて、最初の索引を持つ索引は、最初に索引を付け、次に索引索引索引索引索引索引索引索引索引索引索引索引 – Vikas

関連する問題