sql >> Databasteknik >  >> RDS >> Oracle

Hur man får den n:e strängen i ett generiskt ord eller en mening med en mellanslagsavgränsare

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 )


  1. SQL Server:Extrahera tabellmetadata (beskrivning, fält och deras datatyper)

  2. Ändra kolumnordning i tabellen över postgres

  3. MySQL-variabler som lagrar databasnamn

  4. Eliminera underfrågan för genomsnittligt numeriskt värde