![](/img/trans.png)
[英]How to get column names of a hypothetical table returned by a query 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.