如何在Oracle SQL中的用户Query中找到确切的表名?

问题描述 投票:0回答:2

在Oracle SQL开发人员中,我有一个Query,我必须找到所有以'DIM'和'FCT'和'ABC'开头的表名。

例:

SELECT * FROM DIM_TABLE,fct_table,abc_table WHERE..

我正在尝试通过正则表达式instring和substring.But无法获得表的确切结束位置。

你能帮帮我吗?

sql oracle
2个回答
1
投票

我的方法如下:

一个。首先提取包含以逗号分隔的表名的查询部分

湾将逗号分隔值转换为行

C。按给定的标准过滤掉行

select * from( 
            select  trim(regexp_substr(REGEXP_SUBSTR('SELECT * FROM DIM_TABLE,fct_table,abc_table WHERE','FROM (.*) WHERE',1,1,null,1),'[^,]+', 1, level) ) value, level
              from dual
             connect by regexp_substr(REGEXP_SUBSTR('SELECT * FROM DIM_TABLE,fct_table,abc_table WHERE','FROM (.*) WHERE',1,1,null,1), '[^,]+', 1, level) is not null
               )
        where 
        value like 'DIM%' or value like 'fct%' or value like 'abc%' 

结果:

DIM_TABLE
fct_table
abc_table

编辑2:确定现在您已经更改了原始查询,这将如下所示:

select * from( 
select  trim(regexp_substr(
replace (
replace (
replace (
REGEXP_SUBSTR('SELECT * FROM DIM_TABLE INNER JOIN FCT_TABLE ON FCT_TABLE.COL1 = DIM_TABLE.COL1 LEFT OUTER JOIN ABC_TABLE WHERE','FROM (.*) WHERE',1,1,null,1),
 'INNER JOIN',',') ,'LEFT OUTER JOIN',','), 'ON',',XXX')
 ,'[^,]+', 1, level) ) value, level
  from dual
 connect by regexp_substr(
   replace (
replace (
replace (
REGEXP_SUBSTR('SELECT * FROM DIM_TABLE INNER JOIN FCT_TABLE ON FCT_TABLE.COL1 = DIM_TABLE.COL1 LEFT OUTER JOIN ABC_TABLE WHERE','FROM (.*) WHERE',1,1,null,1),
 'INNER JOIN',',') ,'LEFT OUTER JOIN',','), 'ON',',XXX')
   , '[^,]+', 1, level) is not null
   )
where 
value like 'DIM%' or value like 'FCT%' or value like 'ABC%'

结果2

DIM_TABLE   1
FCT_TABLE   2
ABC_TABLE   4

它不漂亮 - 但它有效 - 我认为你有这个想法......


1
投票
  SELECT table_name
      FROM user_tables 
      WHERE table_name like 'DIM%'
           OR table_name like 'FCT%'
           OR table_name like 'ABC%'
© www.soinside.com 2019 - 2024. All rights reserved.