Genom att använda instr
.
select substr(help, 1, instr(help,' ') - 1)
from ( select 'hello my name is...' as help
from dual )
instr(help,' ')
returnerar positionsindexet för den första förekomsten av det andra argumentet i det första, inklusive strängen du söker efter. dvs den första förekomsten av ' '
i strängen 'hello my name is...'
plus utrymmet.
substr(help, 1, instr(help,' ') - 1)
tar sedan inmatningssträngen från det första tecknet till indexet som anges i instr(...
. Jag tar sedan bort en så att utrymmet inte ingår..
För den n:e förekomsten ändrar du bara detta något:
instr(help,' ',1,n)
är den n:e förekomst av ' '
från den första karaktären. Du måste sedan hitta positionsindexet för nästa index instr(help,' ',1,n + 1)
, räkna slutligen ut skillnaden mellan dem så att du vet hur långt du ska gå i din substr(...
. När du letar efter den n:e , när n är 1 detta går sönder och du måste ta itu med det, som så:
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 )
Detta kommer också att brytas ner vid n . Som du kan se börjar detta bli löjligt så du kanske vill överväga att använda regular expressions
select regexp_substr(help, '[^[:space:]]+', 1, n )
from ( select 'hello my name is...' as help
from dual )