Dividi la stringa in base alla posizione del delimitatore usando Oracle Oracle

Ho una stringa e vorrei dividere quella stringa con delimitatore in una certa posizione.

Ad esempio, my String è F/P/O e il risultato che sto cercando è:

Screenshot del risultato desiderato

Pertanto, vorrei separare la stringa dal delimitatore più lontano.
Nota: alcune delle mie stringhe sono F/O anche per le quali il mio SQL di seguito funziona correttamente e restituisce il risultato desiderato.

L’SQL che ho scritto è il seguente:

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

e il risultato è:

Screenshot del risultato inaspettato

Perché sta succedendo questo e come posso risolverlo?

Si desidera utilizzare regexp_substr() per questo. Questo dovrebbe funzionare per il tuo esempio:

 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 

Qui , a proposito, è l’SQL Fiddle.

Ops. Ho perso la parte della domanda dove si dice l’ ultimo delimitatore. Per questo, possiamo usare regex_replace() per la prima parte:

 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 

Ed ecco questo corrispondente SQL Fiddle.

Pertanto, vorrei separare la stringa dal delimitatore più lontano.

So che questa è una vecchia domanda, ma questo è un semplice requisito per il quale SUBSTR e INSTR sarebbero sufficienti. Le operazioni REGEXP sono ancora più lente e richiedono un utilizzo intensivo della CPU rispetto alle precedenti funzioni subtsr e instr.

 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/PO 

Come hai detto che vuoi il delimitatore più lontano , significherebbe il primo delimitatore dal retro .

Il tuo approccio andava bene, ma ti mancava il parametro start_position in INSTR . Se start_position è negativo , la funzione INSTR conteggia il numero start_position di caratteri dalla fine della stringa e quindi ricerca verso l’inizio della stringa.