2014-11-12 16 views
15

Ich habe eine Zeichenfolge, und ich möchte diese Zeichenfolge durch Trennzeichen an einer bestimmten Position teilen.Split String durch Trennzeichen Position mit Oracle SQL

Zum Beispiel meines String ist F/P/O und das Ergebnis ich suche ist:

Screenshot of desired result

Deshalb mag ich durch den am weitesten Begrenzer die Zeichenfolge trennen.
Hinweis: Einige meiner Strings sind F/O auch für die meine SQL unten funktioniert gut und liefert das gewünschte Ergebnis.

Die SQL I schrieb wie folgt:

ist
SELECT Substr('F/P/O', 1, Instr('F/P/O', '/') - 1) part1, 
     Substr('F/P/O', Instr('F/P/O', '/') + 1) part2 
FROM dual 

und das Ergebnis:

Screenshot of unexpected result

, warum dies geschieht und wie kann ich es beheben?

Antwort

15

Sie möchten dafür regexp_substr() verwenden. Dies sollte für Ihr Beispiel arbeiten:

select regexp_substr(val, '[^/]+/[^/]+', 1, 1) as part1, 
     regexp_substr(val, '[^/]+$', 1, 1) as part2 
from (select 'F/P/O' as val from dual) t 

Here, nebenbei bemerkt, die SQL Fiddle ist.

Hoppla. Ich habe den Teil der Frage vermisst, wo es den letzten Begrenzer sagt. Dafür können wir regex_replace() für den ersten Teil verwenden:

select regexp_replace(val, '/[^/]+$', '', 1, 1) as part1, 
     regexp_substr(val, '[^/]+$', 1, 1) as part2 
from (select 'F/P/O' as val from dual) t 

Und here ist der entsprechende SQL-Fiddle.

+0

Sobald ich den Kommentar über einfacher (siehe unten) gemacht habe, stieß ich auf eine Situation, die nicht einfach war.Vielen Dank Ihnen beide Gordon Linoff und Lalit Kumar B. –

21

Daher möchte ich die Zeichenfolge durch den am weitesten entfernten Begrenzer trennen.

Ich weiß, dass dies eine alte Frage, aber das ist eine einfache Anforderung, für die SUBSTR und INSTR ausreichen würde. REGEXP sind immer noch langsamer und CPU intensive Operationen als die alten Subtsr und Instr Funktionen.

SQL> WITH DATA AS 
    2 (SELECT 'F/P/O' str FROM dual 
    3 ) 
    4 SELECT SUBSTR(str, 1, Instr(str, '/', -1, 1) -1) part1, 
    5   SUBSTR(str, Instr(str, '/', -1, 1) +1) part2 
    6 FROM DATA 
    7/

PART1 PART2 
----- ----- 
F/P O 

Wie Sie gesagt haben Sie die am weitesten Begrenzer wollen, wäre es das erste Trennzeichen aus dem Reverse bedeuten.

Sie Ansatz war in Ordnung, aber Sie fehlten die start_position in INSTR. Wenn die start_position negative ist, zählt die INSTR Funktion start_position Anzahl der Zeichen vom Ende der Zeichenfolge zurück und sucht dann nach dem Anfang der Zeichenfolge.

+1

einfach ist besser: substr und Instr ist einfacher als 'regexp_substr' –

+0

@ glenngarson Manchmal können Sie konfrontiert komplexe Szenarien mit REGEX, wird es eine Menge CPU und andere Ressourcen verbrauchen. Außerdem wird es den Prozess verlangsamen. In solchen Fällen sollten die Daten besser neu gestaltet und normalisiert werden. –

Verwandte Themen