我在一个表格中有一列简单的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
我的查询有什么问题: 它输出带有表名之前的 "FROM "。我想直接获得表名,不带空格。
期望输出:
DWH_OWNER.DWH_ACCOUNTS
DWH_OWNER.DWH_QRM_PRODUCT_TYPES
编辑: 我通过在前一步中使用regexp_substr(tablename,'(\w|_|\.)+',1,2)
完成了对表名的清理。但是是否可能使用单个正则表达式获得所需的输出结果?
这里应该有一个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 Ayoubregexp_substr(sql,'\sFROM\s*(\w|\.)*')
- 是的,但仍会输出 FROM。这就是我的问题。 - Florin Ghita