Oracle如何以特定格式返回字符串

时间:2017-07-04 07:29:40

标签: oracle

我有一个要求,我希望基于一列(Idx)以特定格式返回输出。在一列中,我们有基于该循环应该执行的日期范围。

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 需要查询哪些适用于以上所有情况。

1 个答案:

答案 0 :(得分: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是逗号分隔的值列表 - 但我认为它可以帮助您格式化结果。您可以将其用作构建许多类似格式化解决方案的基础。