Używając instr
.
select substr(help, 1, instr(help,' ') - 1)
from ( select 'hello my name is...' as help
from dual )
instr(help,' ')
zwraca indeks pozycyjny pierwszego wystąpienia drugiego argumentu w pierwszym, włącznie z szukanym ciągiem. tj. pierwsze wystąpienie ' '
w ciągu 'hello my name is...'
plus przestrzeń.
substr(help, 1, instr(help,' ') - 1)
następnie pobiera ciąg wejściowy od pierwszego znaku do indeksu wskazanego w instr(...
. Następnie usuwam jeden, aby nie było miejsca.
Przy n-tym wystąpieniu po prostu zmień to nieznacznie:
instr(help,' ',1,n)
jest n wystąpienie ' '
od pierwszego znaku. Następnie musisz znaleźć indeks pozycyjny następnego indeksu instr(help,' ',1,n + 1)
, na koniec oblicz różnicę między nimi, abyś wiedział, jak daleko zajść w swoim substr(...
. Gdy szukasz n , kiedy n to 1 to się psuje i musisz sobie z tym poradzić, tak:
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 )
To również ulegnie awarii o n . Jak widać, robi się to niedorzeczne, więc warto rozważyć użycie regular expressions
select regexp_substr(help, '[^[:space:]]+', 1, n )
from ( select 'hello my name is...' as help
from dual )