Split String por position de delimitador usando Oracle SQL

Tengo una cadena y me gustaría dividir esa cadena por delimitador en una determinada position.

Por ejemplo, mi String es F/P/O y el resultado que estoy buscando es:

Captura de pantalla del resultado deseado

Por lo tanto, me gustaría separar la cadena por el delimitador más alejado.
Nota: algunas de mis cadenas también son F/O para las cuales mi SQL a continuación funciona bien y arroja el resultado deseado.

El SQL que escribí es el siguiente:

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

y el resultado es:

Captura de pantalla del resultado inesperado

¿Por qué está sucediendo esto y cómo puedo solucionarlo?

Desea usar regexp_substr() para esto. Esto debería funcionar para tu ejemplo:

 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 

Aquí , por cierto, está el SQL Fiddle.

Oops. Me perdí la parte de la pregunta donde dice el último delimitador. Para eso, podemos usar regex_replace() para la primera 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 

Y aquí está este SQL Fiddle correspondiente.

Por lo tanto, me gustaría separar la cadena por el delimitador más alejado.

Sé que esta es una vieja pregunta, pero este es un requisito simple para el cual SUBSTR e INSTR serían suficientes. Las operaciones REGEXP son aún más lentas y con uso intensivo de CPU que las antiguas funciones substsr y 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 

Como dijiste que querías el delimitador más alejado , significaría el primer delimitador del reverso .

Tu aproximación estaba bien, pero echaste de less la position_inicio en INSTR . Si la position_inicial es negativa , la function INSTR count el número de caracteres de la position inicial desde el final de la cadena y luego busca hacia el principio de la cadena.

    Intereting Posts