繁体   English   中英

如何在Oracle SQL中的用户查询中查找确切的表名?

[英]How to find the exact table names in the user Query in Oracle SQL?

在Oracle SQL Developer中,我有一个查询,在其中我必须找到所有以“ DIM”,“ FCT”和“ ABC”开头的表名。

例:

SELECT * FROM DIM_TABLE,fct_table,abc_table WHERE..

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

你能帮我吗?

  SELECT table_name
      FROM user_tables 
      WHERE table_name like 'DIM%'
           OR table_name like 'FCT%'
           OR table_name like 'ABC%'

我的方法如下:

一种。 首先提取查询的一部分,其中包含用逗号分隔的表名

b。 将逗号分隔的值转换为行

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

它不是很漂亮-但却可以-我想你有个主意...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM