Проверка подвыражения в Oracle REGEXP_SUBSTR - PullRequest
1 голос
/ 14 июня 2019

Oracle 12cR1

У меня есть столбец с длинными строками, как показано ниже

:Key1:Value1:Key2:Value2:Key3:Value3:Key4...…..

Ключи являются уникальными числами.Значения - это любое строковое значение, которое может быть даже числом, аналогичным любому другому ключу.Если я даю ключ, я должен получить его соответствующее значение.Например,

lengthy_str_col := ':101:abc:12:43:43:101.4:4:bus'

Для получения значения для ключа, 43, я попробовал следующее:

SELECT REGEXP_SUBSTR(lengthy_str_col,'(:([^:])+)(:[^:]+)') FROM DUAL;

Это дает мне первую пару ключ-значение ':1:abc'.Теперь, когда я знаю, что 43 - третий ключ, я использовал

SELECT REGEXP_SUBSTR(lengthy_str_col,'(:([^:])+)(:[^:]+)', 1, 3, 'i', 4) FROM DUAL;

, чтобы получить значение 101.4 для ключа 43.

Но требуемый ключ может быть в любомслучайная позиция.Есть ли способ получить значение для любого данного ключа?

1 Ответ

4 голосов
/ 14 июня 2019

Вы можете использовать

select REGEXP_SUBSTR(':101:abc:12:43:43:101.4:4:bus', '^(:[^:]+:[^:]+)*?:43:([^:]+)', 1, 1, NULL, 2) as Result from dual

См. это демо регулярных выражений и этот граф регулярных выражений :

enter image description here

Объяснение

  • ^ - начало строки
  • (:[^:]+:[^:]+)*? - ноль или более, но как можно меньше, повторений двух : и 1+ символов, отличных от :
  • :43: - ключ между двоеточиями
  • ([^:]+) - Группа 2 (результат): 1 или более символов, отличных от :
...