SQL Oracle разбивает текст на строки и фильтрует - PullRequest
1 голос
/ 11 июня 2019

У меня есть многострочные текстовые данные, которые хранятся в строках таблицы, как в этом примере. Некоторые строки помечены как «ВАЖНО», и я пытаюсь выбрать список всех «ВАЖНО» строк вместе с соответствующими идентификаторами.

 select 10001 as id, 'some random text 11
 more random text IMPORTANT 12
 more random text IMPORTANT 13' as str
   from dual
  union all
 select 10002, 'other random text 21
 other random text IMPORTANT 22
 other random text 23'
   from dual;

Мне нужно что-то вроде этого ...

id      important text
10001   more random text IMPORTANT 12
10001   more random text IMPORTANT 13
10002   other random text IMPORTANT 22

Мне бы хотелось это в одном SELECT, без каких-либо временных таблиц или курсоров, и я смотрел на regexp_substr с запросом на соединение, но я, похоже, застрял. Буду признателен за вашу помощь.

1 Ответ

2 голосов
/ 11 июня 2019

Вы могли бы сделать что-то вроде этого ... Не совсем уверенный в отношении условия WHERE во внешнем запросе, вы можете настроить его по мере необходимости (я разрешаю ВАЖНО появляться в любой прописной букве, и я не требую, чтобы это былоодно слово - это может быть частью слова «неважно», например, вам придется это исправить), но я считаю, что это не главная проблема, о которой вы спрашиваете.«Основная проблема» действительно решается в подзапросе.

Предложение WITH, конечно, не является частью решения (запрос SELECT);он предназначен только для предоставления тестовых данных.

Прочтите о модификаторе 'm' (для «многострочного») - он позволяет символам ^ и $ совпадать в начале и конце каждой строки текста, а непо умолчанию (это начало и конец всей строки, независимо от символов новой строки).

with
  test_data as (
     select 10001 as id, 'some random text 11
more random text IMPORTANT 12
more random text IMPORTANT 13' as str
   from dual
  union all
 select 10002, 'other random text 21
other random text IMPORTANT 22
other random text 23'
   from dual
)
select *
from   (
         select     id, regexp_substr(str, '^.*$', 1, level, 'm') as str_line
         from       test_data
         connect by level <= regexp_count(str, '^.*$', 1, 'm')
                and prior id =  id
                and prior sys_guid() is not null
       )
where upper(str_line) like '%IMPORTANT%'   -- modify this as needed
;

   ID  STR_LINE                        
-----  --------------------------------
10001  more random text IMPORTANT 12   
10001  more random text IMPORTANT 13   
10002  other random text IMPORTANT 22 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...