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 )