2017-07-04 2 views
2

Ich habe eine Anforderung, wo ich Ausgabe in einem bestimmten Format basierend auf einer Spalte (Idx) zurückgeben möchte. In einer Spalte haben wir den Datumsbereich basierend darauf, dass die Schleife ausgeführt werden soll.Oracle So geben Sie eine Zeichenfolge in einem bestimmten Format zurück

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); 

Wenn Eingang unten ist

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

Output sollte dies sein wird, werden anhand von IDX Spalte

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 

VON t_table_test DELETE WHERE idx = 3; commit; O/P DT: 2017-01-01, CNTRY: USA DT: 2017-01-02, CNTRY: USA LÖSCHEN VON t_table_test WHERE idx = 1; commit; O/P DT: 2017-01-01? DT: 2017-01-02 Fragen, die in allen oben genannten Fällen funktionieren.

+0

Nur um klar zu sein: was würde passieren, wenn die Spalte VAL in mehr als einem Datensatz mehrere Werte enthalten würde? Zum Beispiel, wenn NM = CNTRY und VALUE = USA, KANADA und IDX = 1, sowie NM = DT und VAL = 2017-01-01,2017-01-02 und IDX = 2? – Assafs

+0

Danke mehrere Werte werden nur für DT dort keine andere Spalte haben mehrere Einträge. – Vikas

Antwort

0

Vielleicht können Sie versuchen, diese:

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'); 

Es ist auf den Namen verlassen fixiert ist - mit nur DT eine durch Kommata getrennte Liste von Werten, zum Beispiel - aber ich denke, es könnte Sie Ihre Ergebnisse formatiert helfen . Auf dieser Grundlage können Sie viele ähnliche Formatierungslösungen erstellen.

+0

Eigentlich hier ist der NM-Wert ist nicht festgelegt. es kann alles sein und DT ist Bereich kann es für 3 Tage sein 01-01-2017,02-01-2017,03-01-2017 auch – Vikas

+0

mit DT mehr als zwei Werte ist kein Problem mit der gegebenen Lösung. Wenn NM andere Werte als CNTRY und PART ist, ist es auch OK - können Sie die Werte kennen oder wählen Sie aus einer völlig unbekannten Quelle? – Assafs

+0

ja du hast Recht DT mehr Wert ist hier kein Problem. Voraussetzung ist, dass ich manchmal nur eine Spalte für diese ID habe. Wenn eine Spalte dann col_NM zurückgibt: COL_VL. wenn mehr als ein vaue dann IDX-Spalte verwenden und der erste Index hat zuerst und dann weiter und so weiter. – Vikas

Verwandte Themen