Ved at bruge instr
.
select substr(help, 1, instr(help,' ') - 1)
from ( select 'hello my name is...' as help
from dual )
instr(help,' ') returnerer positionsindekset for den første forekomst af det andet argument i det første, inklusive den streng, du søger efter. dvs. den første forekomst af ' ' i strengen 'hello my name is...' plus pladsen.
substr(help, 1, instr(help,' ') - 1) tager derefter inputstrengen fra det første tegn til indekset angivet i instr(... . Jeg fjerner så en, så pladsen ikke er med..
For den n'te forekomst skal du bare ændre dette lidt:
instr(help,' ',1,n) er den n. forekomst af ' ' fra det første tegn. Du skal derefter finde positionsindekset for det næste indeks instr(help,' ',1,n + 1) , find endelig forskellen på dem, så du ved, hvor langt du skal gå i din substr(... . Mens du leder efter den n. , når n er 1 går det i stykker, og du skal håndtere det, sådan:
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 )
Dette vil også nedbrydes ved n . Som du kan se, bliver dette latterligt, så du bør overveje at bruge regular expressions
select regexp_substr(help, '[^[:space:]]+', 1, n )
from ( select 'hello my name is...' as help
from dual )