2017-02-01 2 views
0

запросов:значение Поиск ключа в строке

Select searchtext from xyz. 

Результат

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

В этом я хочу ServiceID в качестве имени столбца и 100615188 в качестве значения. как

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

Ваш ожидаемый результат показан неправильно. Вы сказали - * serviceID как имя столбца и 100615188 *, а затем в ожидаемом выходе вы показываете 100556732, который на самом деле передается вручную. – GurV

+0

Давайте уточним это требование. У вашей входной строки может быть много пар - вы ТОЛЬКО для поиска ServiceID, а не для какой-либо другой пары/столбца/атрибута, правильно? У вас может быть много строк на входе, если у вас есть только один столбец на выходе, как вы их различаете? Есть ли отдельный столбец идентификатора на ваших входах, чтобы служить в качестве первичного ключа, и если это так не должно быть также на выходе? Тогда - что, если в вашей строке ввода содержится более одного ServiceID? Что, если их нет? (Если эти ситуации невозможны в ваших данных, скажите об этом.) – mathguy

ответ

1

Вы можете использовать регулярные выражения для решения этой:

select regexp_replace(col,'.*serviceID\s+(\d+).*','\1') from your_table; 

Демо:

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> 

Детали:

'.*serviceID\s+(\d+).*' 
  • .* - Матч ноль или более символов перед тем serviceID
  • serviceID - соответствует тексту буквально
  • \s+ - матч 1 или более символ пробела после serviceID
  • () - построить захвата группы
  • \d+ - матч 1 или больше цифр

и в замене части

  • \1 - заменить весь матч первой захваченной группой, используя обратную привязку.

Если ServiceID всегда будет первым целая часть в строке, то вы можете также использовать regexp_substr:

select 
    regexp_substr(col,'\d+') serviceId 
from your_table; 
+0

Благодарим вас за руководство. –

+0

regexp_substr (SEARCHTEXT, '[^] +', INSTR (верхний (SEARCHTEXT), 'SERVICENAME', 1), 2) AS service_name –

Смежные вопросы