Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como obter a enésima string em qualquer palavra ou frase genérica com um delimitador de espaço


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

instr(help,' ') retorna o índice posicional da primeira ocorrência do segundo argumento no primeiro, incluindo a string que você está procurando. ou seja, a primeira ocorrência de ' ' na string 'hello my name is...' mais o espaço.

substr(help, 1, instr(help,' ') - 1) então leva a string de entrada do primeiro caractere para o índice indicado em instr(... . Em seguida, removo um para que o espaço não seja incluído.

Para a enésima ocorrência, altere um pouco isso:

instr(help,' ',1,n) é o ocorrência de ' ' desde o primeiro caractere. Você então precisa encontrar o índice posicional do próximo índice instr(help,' ',1,n + 1) , por fim, descubra a diferença entre eles para que você saiba até onde ir em seu substr(... . Como você está procurando o , quando n é 1 isso quebra e você tem que lidar com isso, assim:
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 )

Isso também será dividido em n . Como você pode ver, isso está ficando ridículo, então você pode considerar o uso de regular expressions
select regexp_substr(help, '[^[:space:]]+', 1, n )
  from ( select 'hello my name is...' as help
           from dual )