【发布时间】:2016-05-19 15:20:44
【问题描述】:
我在一个带有简单 sql 查询的表中有一个列,我想从它们中 regexp_substr 表名。 文本示例:
SELECT PT.PT_PARTY_NAME VALUE,PT.PT_PARTY_NAME LABEL
FROM DWH_OWNER.DWH_ACCOUNTS ACC,
DWH_OWNER.DWH_PARTIES PT
WHERE ACC.ACC_SOURCE_ID = :P_DOMVAL_REF1
AND ACC.ACC_PT_KEY = PT.PT_KEY
或
SELECT DISTINCT QRMPT_PRODUCT VALUE, QRMPT_PRODUCT LABEL FROM
DWH_OWNER.DWH_QRM_PRODUCT_TYPES ORDER BY VALUE
所以,我需要找到“FROM”,跳过一些空格然后得到第一个单词。 我暂时对第二张桌子不感兴趣。
我做了什么:
select
sql,
regexp_substr(upper(sql), '(\s)FROM(\s)*([[:alnum:]]|\.|_)*') tablename
from my_table_with_queries;
输出:
FROM DWH_OWNER.DWH_ACCOUNTS
FROM
DWH_OWNER.DWH_QRM_PRODUCT_TYPES
我的 qyery 出了什么问题: 它在表名前输出带有“FROM”的表名。我想要直接的表名,没有空格。
期望的输出:
DWH_OWNER.DWH_ACCOUNTS
DWH_OWNER.DWH_QRM_PRODUCT_TYPES
编辑:
我设法在上一步中完成regexp_substr(tablename, '(\w|_|\.)+', 1,2) 来清理表名。但是有可能使用单个正则表达式获得所需的输出吗?
Here 应该是一个 sqlfiddle,但该站点目前无法运行。查询:
with a as (
select 'SELECT PT.PT_PARTY_NAME VALUE,PT.PT_PARTY_NAME LABEL
FROM DWH_OWNER.DWH_ACCOUNTS ACC,
DWH_OWNER.DWH_PARTIES PT
WHERE ACC.ACC_SOURCE_ID = :P_DOMVAL_REF1
AND ACC.ACC_PT_KEY = PT.PT_KEY' sql from dual
union all
select 'SELECT DISTINCT QRMPT_PRODUCT VALUE, QRMPT_PRODUCT LABEL FROM
DWH_OWNER.DWH_QRM_PRODUCT_TYPES ORDER BY VALUE' from dual
)
select
regexp_substr(upper(sql), '\sFROM\s*(\w|\.|_)*') tablename, sql
from a;
【问题讨论】:
-
能不能简化成
\sFROM\s*([\w.]*)? -
@Thomas 稍作修改 -
regexp_substr(sql,'\sFROM\s*(\w|\.)*')- 是的,但仍会输出 FROM。那是我的问题。 -
你为什么在
\s周围使用捕获组? -
我不知道什么是捕获组。我是正则表达式的初学者。不是使用 Oracle,而是使用正则表达式是 :)
-
您会在某个时候想要第二张桌子吗?您是否需要允许 CTE 和内联视图以及子查询?最终目标是什么 - 找到语句引用的所有表?
标签: regex oracle regexp-substr