Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment obtenir la nième chaîne dans n'importe quel mot ou phrase générique avec un délimiteur d'espace

En utilisant instr .

select substr(help, 1, instr(help,' ') - 1)
  from ( select 'hello my name is...' as help
           from dual )

instr(help,' ') renvoie l'index de position de la première occurrence du deuxième argument dans le premier, y compris la chaîne que vous recherchez. c'est-à-dire la première occurrence de ' ' dans la chaîne 'hello my name is...' plus l'espace.

substr(help, 1, instr(help,' ') - 1) prend ensuite la chaîne d'entrée du premier caractère à l'index indiqué dans instr(... . J'en retire ensuite un pour que l'espace ne soit pas inclus..

Pour la nième occurrence, modifiez simplement ceci :

instr(help,' ',1,n) est le énième occurrence de ' ' dès le premier caractère. Il faut ensuite trouver l'index positionnel de l'index suivant instr(help,' ',1,n + 1) , faites enfin la différence entre eux pour savoir jusqu'où aller dans votre substr(... . Alors que vous cherchez le énième , quand n est 1 cela tombe en panne et vous devez vous en occuper, comme ceci :

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 )

Cela tombera également en panne à n . Comme vous pouvez le constater, cela devient ridicule, vous pouvez donc envisager d'utiliser regular expressions

select regexp_substr(help, '[^[:space:]]+', 1, n )
  from ( select 'hello my name is...' as help
           from dual )