sql >> Base de Datos >  >> RDS >> Oracle

Cómo obtener la enésima cadena en cualquier palabra u oración genérica con un delimitador de espacio

Usando instr .

select substr(help, 1, instr(help,' ') - 1)
  from ( select 'hello my name is...' as help
           from dual )

instr(help,' ') devuelve el índice posicional de la primera aparición del segundo argumento en el primero, incluida la cadena que está buscando. es decir, la primera aparición de ' ' en la cadena 'hello my name is...' más el espacio.

substr(help, 1, instr(help,' ') - 1) luego toma la cadena de entrada desde el primer carácter hasta el índice indicado en instr(... . Luego elimino uno para que el espacio no esté incluido..

Para la enésima aparición, simplemente cambie esto ligeramente:

instr(help,' ',1,n) es el enésimo ocurrencia de ' ' del primer carácter. Luego debe encontrar el índice posicional del siguiente índice instr(help,' ',1,n + 1) , finalmente calcule la diferencia entre ellos para que sepa hasta dónde llegar en su substr(... . Mientras buscas el enésimo , cuando n es 1 esto se descompone y tienes que lidiar con eso, así:

select substr( help
             , decode( n
                     , 1, 1
                     , instr(help, ' ', 1, n - 1) + 1
                       )
             , decode( &1
                     , 1, instr(help, ' ', 1, n ) - 1
                     , instr(help, ' ', 1, n) - instr(help, ' ', 1, n - 1) - 1
                       )
               )
  from ( select 'hello my name is...' as help
           from dual )

Esto también se desglosará en n . Como puede ver, esto se está volviendo ridículo, por lo que es posible que desee considerar el uso de regular expressions

select regexp_substr(help, '[^[:space:]]+', 1, n )
  from ( select 'hello my name is...' as help
           from dual )