Vous pouvez utiliser des expressions régulières pour résoudre ce:
select regexp_replace(col,'.*serviceID\s+(\d+).*','\1') from your_table;
Démo:
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
SQL> with your_table(col) as (
2 select 'serviceID 100615188 accessID 100615187 accessPathSpeed 5Mbps handoverID 100556732 accessSpeed 5Mbps' from dual
3 )
4 select
5 regexp_replace(col,'.*serviceID\s+(\d+).*','\1') serviceId
6 from your_table;
SERVICEID
---------
100615188
SQL>
Détails:
'.*serviceID\s+(\d+).*'
.*
- Faites correspondre à zéro ou plus de caractère avant serviceID
serviceID
- correspondre au texte littéralement
\s+
- Match 1 ou plus de caractère espace après serviceID
()
- pour construire un groupe de capture
\d+
- Match 1 ou plusieurs chiffres
et dans la partie remplacer
\1
- remplacer l'ensemble du match avec le premier groupe capturé en utilisant les références arrières.
Si le serviceId est toujours va être la première partie entière dans la chaîne, vous pouvez également utiliser regexp_substr
:
select
regexp_substr(col,'\d+') serviceId
from your_table;
Votre résultat attendu est montré de manière incorrecte. Vous avez dit - * ServiceId comme nom de colonne et 100615188 * puis dans la sortie attendue, vous affichiez 100556732 qui est en fait handoverId – GurV
Clarifions l'exigence. Votre chaîne d'entrée peut avoir plusieurs paires - vous êtes SEULS pour ServiceID, et pas pour toute autre paire/colonne/attribut, correct? Vous pouvez avoir plusieurs lignes dans l'entrée, si vous n'avez qu'une colonne dans la sortie, comment les différenciez-vous? Y a-t-il aussi une colonne id distincte dans vos entrées, pour servir de clé primaire, et si tel n'est pas le cas, elle doit également être dans la sortie? Alors - et s'il y a plus d'un ServiceID dans votre chaîne d'entrée? Et s'il n'y en a pas? (Si ces situations ne sont pas possibles dans vos données, veuillez le dire.) – mathguy