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 nº 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 nº , 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 )