2017-02-18 6 views
0

Ich brauche durchschleifen in einem Join thats was ich denke, ich habe geschrieben. Ich poste den Code.Split der reguläre Ausdruck und Schleife durch

select listagg(request_num,',') within group (order by request_num) as request_num,segmentation_name from (
select MST.REQUEST_NUM,seg_dtls.SEGMENT_NAME,LAST_UPDATED_date,seg_dtls.segmentation_name from 
(select * from rp_sr_master) Mst, 
(select SUBSTR(ANSWER,1,INSTR (ANSWER, '~', 1)-1) AS SM_ID,sr_id from rp_sR_details 
WHERE Q_ID in (SELECT Q_ID FROM RP_QUESTIONS WHERE field_id='LM_LRE_Q6') 
    ) Dtls, (select SM_ID, SQL_STATEMENT, CREATION_DATE, UPDATED_DATE, SEGMENT_NAME,segmentation_name ,TOTAL_COUNT 
from rp_sEGMENT_master) seg_dtls 
where Dtls.SM_ID=seg_dtls.SM_ID 
and Dtls.sr_id=Mst.sr_id) 
group by segmentation_name; 

Das Problem, das ich hier bin vor in den folgenden Ergebnissen,

(select SUBSTR(ANSWER,1,INSTR (ANSWER, '~', 1)-1) AS SM_ID,sr_id from rp_sR_details 
    WHERE Q_ID in (SELECT Q_ID FROM RP_QUESTIONS WHERE field_id='LM_LRE_Q6') 
     ) 

In dem obigen Code wird Antwort so etwas wie diese:

2603~NG non IaaS IT Professional^2600~NG non IaaS Senior IT^2598~NG data profiling SENIOR IT professional^2595~Nigeria data profiling IT professiona

Er nimmt nur die erste Zahl das ist 2603 und andere werden weggelassen.

Gibt es eine Möglichkeit, ich kann die ganze Nummer in dieser "ANSWER" durchlaufen. Ich bin auf der Suche nach Ideen.

Danke.

Antwort

1

Eine Idee ist es, ein Verfahren zum Aufteilen eines Komma getrennten Zeichenfolge in Zeilen zu verwenden,
Sie Beispiele für diese Methode in den folgenden Antworten finden können:

Splitting comma separated values in Oracle

How can I use regex to split a string, using a string as a delimiter?

Die oben genannten Lösungen Verwenden Sie regexp_substr Funktion.
Wenn Sie sich in Details von Oracles REGEXP_SUBSTR function vertiefen, werden Sie feststellen, dass dort ein optionaler position Parameter vorhanden ist.
SQL to generate a list of numbers from 1 to 100
(dh SELECT LEVEL n FROM DUAL CONNECT BY LEVEL <= 100) in der folgenden Art und Weise:

with xx as (
select '2603~NG non IaaS IT Professional^2600~NG non IaaS Senior ' 
     || 'IT^2598~NG data profiling SENIOR IT professional^2595~Nigeria ' 
     || 'data profiling IT professiona' as answer 
from dual 
) 
select LEVEL AS n, regexp_substr(answer, '\d+', 1, level) as nbr 
from xx 
connect by level <= 6 
; 

Die obige Abfrage erzeugt das folgende Ergebnis:



Dieser Parameter kann in dieser Antwort gezeigt mit einem sulution kombiniert werden
N |NBR | 
--|-----| 
1 |2603 | 
2 |2600 | 
3 |2598 | 
4 |2595 | 
5 |  | 
6 |  | 

Was wir brauchen, ist Null-Werte aus dem res zu beseitigen ultset, kann es IS NOT NULL

with xx as (
select '2603~NG non IaaS IT Professional^2600~NG non IaaS Senior ' 
     || 'IT^2598~NG data profiling SENIOR IT professional^2595~Nigeria ' 
     || 'data profiling IT professiona' as answer 
from dual 
) 
select LEVEL AS n, regexp_substr(answer, '\d+', 1, level) as nbr 
from xx 
connect by regexp_substr(answer, '\d+', 1, level) IS NOT NULL 
; 

N |NBR | 
--|-----| 
1 |2603 | 
2 |2600 | 
3 |2598 | 
4 |2595 | 

Die obige Abfrage funktioniert, für einen einzelnen Datensatz perfekt mit einem einfachen Zustand durchgeführt wird, wird aber verwirrt, wenn wir versuchen, zwei oder mehr Zeilen zu analysieren. Glücklicherweise gibt es eine andere Antwort auf SO, die dieses Problem zu lösen hilft:

Is there any alternative for OUTER APPLY in Oracle?


-- source data 
WITH xx as (
select 1 AS id, 
     '2603~NG non IaaS IT Professional^2600~NG non IaaS Senior ' 
     || 'IT^2598~NG data profiling SENIOR IT professional^2595~Nigeria ' 
     || 'data profiling IT professiona' as answer 
from dual 
UNION ALL 
select 2 AS id, 
     '11111~NG non IaaS IT Professional^22222~NG non IaaS Senior ' 
     || 'IT^2598~NG data 33333 profiling SENIOR IT professional^44~Nigeria ' 
     || 'data profiling 5 IT professiona 66' as answer 
from dual 
) 
-- end of source data 


SELECT t.ID, t1.n, t1.nbr 
FROM xx t 
CROSS JOIN LATERAL (
     select LEVEL AS n, regexp_substr(t.answer, '\d+', 1, level) as nbr 
     from dual 
     connect by regexp_substr(t.answer, '\d+', 1, level) IS NOT NULL 
) t1; 

die obige Abfrage analysiert Zahlen aus zwei Datensätze und zeigt dann in der folgenden Form:

ID |N |NBR | 
---|--|------| 
1 |1 |2603 | 
1 |2 |2600 | 
1 |3 |2598 | 
1 |4 |2595 | 
2 |1 |11111 | 
2 |2 |22222 | 
2 |3 |2598 | 
2 |4 |33333 | 
2 |5 |44 | 
2 |6 |5  | 
2 |7 |66 | 

Ich glaube, Sie werden es schaffen, diese einfache "Parsing" -Abfrage in Ihre Hauptdatei zusammenzuführen Abfrage.

+0

danke, ich versuche zu lernen.so hier sind meine Zweifel. '\ d +' findet die Ziffern in einem Ausdruck. Ich bin in einer Situation, in der Antwort wie 345 ~ nas 2016^234 ~ ras2034^die 34_234^Hilfe sein würde 3. hier versuchte ich ein regsub, um Ziffern zwischen^und ~ zu finden, aber die erste Ziffer hat nicht ^. Ich habe das versucht [0-9] * (? = ~). – user3165555