separar salida regexp_substr procedimiento por parametros into ejemplos ejecutar developer delimitada con comas cadena array almacenado sql oracle split substring delimiter

salida - Split String por posición de delimitador usando Oracle SQL



regexp_substr oracle (2)

Tengo una cadena y me gustaría dividir esa cadena por delimitador en una determinada posición.

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

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:

¿Por qué sucede 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/P O

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 menos la posición_inicio en INSTR . Si la posición_inicial es negativa , la función INSTR cuenta el número de caracteres de la posición inicial desde el final de la cadena y luego busca hacia el principio de la cadena.