使用regexp_like在dba_source中搜索文本

时间:2018-12-10 08:58:31

标签: sql oracle

我需要搜索dba_source中'FROM'和'WHERE'之间的所有文本,我不知道我需要在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 :(得分:2)

您的正则表达式没有意义,它期望一个类似FROM(a word)WHERE的字符串,且两者之间没有任何空格;而且,它区分大小写。

此外,regexp_like仅检查值是否与正则表达式匹配,而我了解到您正在寻找从值中实际提取数据的方法。因此,您应该改用regexp_substr

无论情况如何,这都会提取FROMWHERE之间的值。

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

答案 1 :(得分:1)

在模式中使用通配符。第一个查询将在etxt列中找到所有具有FROM和WHERE的行,第二个查询将提取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'参数使搜索不区分大小写,第二个示例中的最后一个参数表示应该匹配的是第二个组