2017-02-01 1 views
0

Requête:valeur Rechercher une clé dans une chaîne

Select searchtext from xyz. 

Résultat

searchtext 
------------------------------------------------------------------------------- 
serviceID 100615188 accessID 100615187 accessPathSpeed 5Mbps handoverID 100556732 accessSpeed 5Mbps 

Dans ce que je veux ServiceId comme nom de colonne et 100.615.188 en tant que valeur. comme

ServiceID 
----------- 
100556732 
+0

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

+0

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

Répondre

1

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; 
+0

merci de vos conseils. –

+0

regexp_substr (searchText, '[^] +', INSTR (supérieure (searchText), 'SERVICENAME', 1), 2) AS service_name –