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.
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