使用REGEXP_SUBSTR提取FROM与指定关键字间的Oracle表名
修正后的正则表达式及解决方法
问题原因
你当前的正则会匹配SQL中第一个出现的FROM(比如示例里upper(c from xyz)中的FROM),导致提取的内容混入了函数内的无关文本。核心是要精准匹配最后一个FROM——也就是对应目标表名的那个FROM。
修正后的REGEXP_SUBSTR语句
REGEXP_SUBSTR(query_blob, '.*FROM\\s+(.*?)\\s+(WHERE|FETCH|ORDER|GROUP)', 1, 1, 'i', 1)
正则逻辑拆解
.*:贪婪匹配任意字符,直到定位到最后一个FROM,自动跳过所有出现在函数、子查询里的前置FROMFROM\\s+:匹配FROM关键字,以及后面的一个或多个空白字符(兼容SQL里的空格、制表符等格式)(.*?):非贪婪匹配表名内容,直到遇到后续的空白和指定关键字\\s+(WHERE|FETCH|ORDER|GROUP):匹配表名后的空白,以及你指定的SQL结尾关键字'i':开启大小写不敏感模式,兼容from/From等不同写法- 最后一个参数
1:指定提取第一个捕获组的内容(即目标表名)
测试验证
针对你的示例SQL:
"select a,b ,upper(c from xyz), d from t1 where xyx;"
执行修正后的语句会正确返回t1。
内容的提问来源于stack exchange,提问作者Sneha S
相关产品推荐
相关产品推荐

