在Oracle SQL开发人员中,我有一个查询,我必须找到所有以' DIM'开头的表名。和' FCT'和' ABC'。
示例:
SELECT * FROM DIM_TABLE,fct_table,abc_table WHERE..
我正在尝试通过正则表达式instring和substring.But无法获得表格的确切结束位置。
你能帮帮我吗?
答案 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
它不漂亮 - 但它有效 - 我认为你有这个想法......