Чрез използване на instr
.
select substr(help, 1, instr(help,' ') - 1)
from ( select 'hello my name is...' as help
from dual )
instr(help,' ')
връща позиционния индекс на първото появяване на втория аргумент в първия, включително низа, който търсите. т.е. първото срещане на ' '
в низа 'hello my name is...'
плюс пространството.
substr(help, 1, instr(help,' ') - 1)
след това взема входния низ от първия знак до индекса, посочен в instr(...
. След това премахвам един, така че пространството да не е включено..
За n-то срещане просто променете това леко:
instr(help,' ',1,n)
е n-тият поява на ' '
от първия знак. След това трябва да намерите позиционния индекс на следващия индекс instr(help,' ',1,n + 1)
, накрая разберете разликата между тях, за да знаете докъде да стигнете във вашия substr(...
. Докато търсите n-тия , когато n е 1 това се разваля и трябва да се справите с него, ето така:
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 )
Това също ще се повреди при n . Както можете да видите, това става нелепо, така че може да обмислите използването на regular expressions
select regexp_substr(help, '[^[:space:]]+', 1, n )
from ( select 'hello my name is...' as help
from dual )