我需要搜索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'
答案 0 :(得分:2)
您的正则表达式没有意义,它期望一个类似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
答案 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'
参数使搜索不区分大小写,第二个示例中的最后一个参数表示应该匹配的是第二个组