Поиск текста в dba_source с помощью regexp_like - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужно найти каждый текст, который будет между 'FROM' и 'WHERE' в dba_source, я не знаю, какой образец мне нужно использовать в regexp_like, чтобы получить ожидаемый результат.

, чтоне работает вообще:

select * from dba_source v
where regexp_like (upper(v.text), '(FROM)+\w+(WHERE)'); 

есть идеи, что я делаю не так?

некоторые примеры:

в dba_source.text:

'FROM someschema.table WHERE[...]'
'FROM someschema2.table2, someschema3.table3 WHERE[...]'
'FROM someschema4.table4 WHERE[...]'

Я хочу получить результат просто:

'someschema.table'
'someschema2.table2, someschema3.table3'
'someschema4.table4'

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Ваше регулярное выражение не имеет смысла, оно ожидает строку типа FROM(a word)WHERE без пробела между ними;Кроме того, он чувствителен к регистру.

Кроме того, regexp_like только проверяет, соответствует ли значение регулярному выражению, хотя я понимаю, что вы действительно хотите извлечь данные из значения.Следовательно, вы должны использовать regexp_substr вместо.

Это извлечет значения между FROM и WHERE, независимо от регистра.

SELECT 
    REGEXP_SUBSTR(v.text, 'FROM(.*)WHERE',1 ,1 ,'i', 1) 
FROM dba_source v
0 голосов
/ 10 декабря 2018

Используйте подстановочные знаки в вашем шаблоне.Первый запрос найдет все строки, которые имеют FROM и WHERE в столбце etxt, а второй столбец извлечет то, что находится между FROM и WHERE, поэтому выберите лучшую в зависимости от того, что вы хотите.

SELECT * FROM dba_source v
WHERE REGEXP_LIKE (v.text, 'FROM .* WHERE', 'i'); 

SELECT REGEXP_SUBSTR(v.text, 'FROM (.*) WHERE',1 ,1 ,'i', 2)
FROM dba_source v

Параметр 'i' делает регистр нечувствительным к регистру, а последний параметр во втором примере означает, что это вторая группа, которая должна соответствовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...