Получить подстроку из строки - PullRequest
0 голосов
/ 19 февраля 2020

У меня проблема с извлечением подстроки из строки. Входные значения похожи на

{Resultset: 234, edf, ejj, Resultvalue: hsh, 23,hhs}
{ hashvalue: 233, ehdh, Resultset: 2dd34, edf, ejj}
3rd value:
{hashvalue: 233, ehdh, Resultset: 2dd34, Resultvalue: hsh, 23,hhs}
4th value
{hashvalue: 233, ehdh, Resultset:, Resultvalue: hsh, 23,hhs}
5th value
Null
6th value
{hashvalue: 233, ehdh, Resultvalue: hsh, 23,hhs}

Выходные данные должны быть похожи на

Resultset: 234, edf, ejj
Resultset: 2dd34, edf, ejj
Resultset: 2dd34
Resultset:
Null
Null
Like this.

Я пытался, но ожидаемая строка иногда появляется сначала, а иногда наконец. Иногда я получаю строку, превышающую ожидаемую.

Я думаю, мне нужно регулярное выражение для поиска двух символов, и когда появляется первое :, не go для второго }

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Возвращает первую запомненную группу «Resultset: затем что-либо (не жадное)», когда за этой группой следует другая группа, состоящая из [запятой, затем нуля или более пробелов, затем 1 или более символов слова, заканчивающихся на двоеточие] ИЛИ [правая фигурная скобка].

CAVEAT: REGEXP_SUBSTR () возвращает NULL, если совпадение не может быть найдено. Возможно, вы захотите заключить вызов в NVL () и вернуть что-то, если значение равно NULL.

Редактировать: Обновлено, чтобы отразить ваши новые тестовые данные.

WITH tbl(ID, str) AS (
  SELECT 1, '{Resultset: 234, edf, ejj, Resultvalue: hsh, 23,hhs}' FROM dual UNION ALL
  SELECT 2, '{ hashvalue: 233, ehdh, Resultset: 2dd34, edf, ejj}'    FROM dual  UNION ALL
  SELECT 3, '{hashvalue: 233, ehdh, Resultset: 2dd34, Resultvalue: hsh, 23,hhs}' FROM dual UNION ALL
  SELECT 4, '{hashvalue: 233, ehdh, Resultset:, Resultvalue: hsh, 23,hhs}' FROM dual UNION ALL
  SELECT 5, NULL FROM dual UNION ALL
  SELECT 6, '{hashvalue: 233, ehdh, Resultvalue: hsh, 23,hhs}' FROM dual
)
SELECT ID,
  REGEXP_SUBSTR(str, '(Resultset:.*?)(, *\w+:|})', 1, 1, 'i', 1) resultset
FROM tbl
ORDER BY ID;

         ID RESULTSET                                                         
---------- ------------------------------------------------------------------
         1 Resultset: 234, edf, ejj                                          
         2 Resultset: 2dd34, edf, ejj                                        
         3 Resultset: 2dd34                                                  
         4 Resultset:                                                        
         5                                                                   
         6                                                                   

6 rows selected.
0 голосов
/ 19 февраля 2020

Вы можете использовать REGEXP_SUBSTR для этого. Найдите строку 'Resultset', за которой следуют несколько не запятых, затем одна запятая, затем несколько не запятых, затем одна запятая, затем несколько не запятых.

regexp_substr(colname, 'Resultset[^,]*,[^,]*,[^,]*')
...