Вы можете использовать регулярные выражения для решения этой:
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;
Ваш ожидаемый результат показан неправильно. Вы сказали - * serviceID как имя столбца и 100615188 *, а затем в ожидаемом выходе вы показываете 100556732, который на самом деле передается вручную. – GurV
Давайте уточним это требование. У вашей входной строки может быть много пар - вы ТОЛЬКО для поиска ServiceID, а не для какой-либо другой пары/столбца/атрибута, правильно? У вас может быть много строк на входе, если у вас есть только один столбец на выходе, как вы их различаете? Есть ли отдельный столбец идентификатора на ваших входах, чтобы служить в качестве первичного ключа, и если это так не должно быть также на выходе? Тогда - что, если в вашей строке ввода содержится более одного ServiceID? Что, если их нет? (Если эти ситуации невозможны в ваших данных, скажите об этом.) – mathguy