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

时间:2018-02-28 06:24:47

标签: sql oracle

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

示例:

SELECT * FROM DIM_TABLE,fct_table,abc_table WHERE..

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

你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我的方法如下:

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

湾将逗号分隔值转换为行

℃。按照给定的标准过滤掉行

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

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