2017-07-04 56 views
2

我有一個要求,我希望以特定格式返回基於一列(Idx)的輸出。在一列中,我們有基於該循環的日期範圍應該執行。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柱

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

I/P

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 

DELETE FROM t_table_test WHERE IDX = 3; 承諾; O/P DT:2017-01-01,CNTRY:USA?DT:2017-01-02,CNTRY:USA DELETE FROM t_table_test WHERE 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也 – Vikas

+0

DT有兩個以上的值是不是問題與給定的解決方案。 NM是CNTRY以外的其他值,PART也可以 - 您可以知道這些值嗎?或者您是從一個完全未知的來源選擇的? – Assafs

+0

是的,你是對的DT更多的價值在這裏不是問題。要求是有時我只有一個列的ID。如果一列然後返回col_NM:COL_VL。如果多於一個vlaue則使用IDX列,並且具有第一個索引的應該是第一個索引,然後是第二個索引,依此類推。 – Vikas