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 )