使用Oracle REGEXP_SUBSTR提取下划线分隔的大写数据
Using Oracle REGEXP_SUBSTR to extract uppercase data separated by underscores
示例列数据:
Failure on table TOLL_USR_TRXN_HISTORY:
Failure on table DOCUMENT_IMAGES:
Error in CREATE_ACC_STATEMENT() [line 16]
我正在寻找一种方法来仅提取下划线分隔的大写单词(table 名称)。我想要整个 table 名称,最大为 3 个下划线,最小为 1 个下划线。我想忽略任何 initcap 的大写字母。
您可以对每个替换的单独行使用这样的 a SQL Select statement
(Failure on table TOLL_USR_TRXN_HISTORY
在下面的例子中)
来自您的文字:
select regexp_replace(q.word, '[^a-zA-Z0-9_]+', '') as word
from
(
select substr(str,nvl(lag(spc) over (order by lvl),1)+1*sign(lvl-1),
abs(decode(spc,0,length(str),spc)-nvl(lag(spc) over (order by lvl),1))) word,
nvl(lag(spc) over (order by lvl),1) lg
from
(
with tab as
( select 'Failure on table TOLL_USR_TRXN_HISTORY' str from dual )
select instr(str,' ',1,level) spc, str, level lvl
from tab
connect by level <= 10
)
) q
where lg > 0
and upper(regexp_replace(q.word, '[^a-zA-Z0-9_]+', ''))
= regexp_replace(q.word, '[^a-zA-Z0-9_]+', '')
and ( nvl(length(regexp_substr(q.word,'_',1,1)),0)
+ nvl(length(regexp_substr(q.word,'_',1,2)),0)
+ nvl(length(regexp_substr(q.word,'_',1,3)),0)) > 0
and nvl(length(regexp_substr(q.word,'_',1,4)),0) = 0;
从下面的错误消息中仅获取 table 名称的替代方法,仅当 table_name 以上述方式结束时,下面的查询才有效
with t as( select 'Failure on table TOLL_USR_TRXN_HISTORY:' as data from dual)
SELECT RTRIM(substr(data,instr(data,' ',-1)+1),':') from t
所有消息的新查询:
select replace (replace ( 'Failure on table TOLL_USR_TRXN_HISTORY:
Failure on table DOCUMENT_IMAGES:' , 'Failure on table', ' ' ),':',' ') from dual
你可以直接使用regexp_substr()
:
select regexp_substr(str, '[A-Z_]{3,}', 1, 1, 'c')
from (select 'Failure on table TOLL_USR_TRXN_HISTORY' as str from dual) x;
该模式表示要查找包含大写字母或下划线且至少 3 个字符长的子字符串。 1, 1
表示从第一个位置开始,return 表示第一个匹配。 'c'
使搜索区分大小写。
示例列数据:
Failure on table TOLL_USR_TRXN_HISTORY:
Failure on table DOCUMENT_IMAGES:
Error in CREATE_ACC_STATEMENT() [line 16]
我正在寻找一种方法来仅提取下划线分隔的大写单词(table 名称)。我想要整个 table 名称,最大为 3 个下划线,最小为 1 个下划线。我想忽略任何 initcap 的大写字母。
您可以对每个替换的单独行使用这样的 a SQL Select statement
(Failure on table TOLL_USR_TRXN_HISTORY
在下面的例子中)
来自您的文字:
select regexp_replace(q.word, '[^a-zA-Z0-9_]+', '') as word
from
(
select substr(str,nvl(lag(spc) over (order by lvl),1)+1*sign(lvl-1),
abs(decode(spc,0,length(str),spc)-nvl(lag(spc) over (order by lvl),1))) word,
nvl(lag(spc) over (order by lvl),1) lg
from
(
with tab as
( select 'Failure on table TOLL_USR_TRXN_HISTORY' str from dual )
select instr(str,' ',1,level) spc, str, level lvl
from tab
connect by level <= 10
)
) q
where lg > 0
and upper(regexp_replace(q.word, '[^a-zA-Z0-9_]+', ''))
= regexp_replace(q.word, '[^a-zA-Z0-9_]+', '')
and ( nvl(length(regexp_substr(q.word,'_',1,1)),0)
+ nvl(length(regexp_substr(q.word,'_',1,2)),0)
+ nvl(length(regexp_substr(q.word,'_',1,3)),0)) > 0
and nvl(length(regexp_substr(q.word,'_',1,4)),0) = 0;
从下面的错误消息中仅获取 table 名称的替代方法,仅当 table_name 以上述方式结束时,下面的查询才有效
with t as( select 'Failure on table TOLL_USR_TRXN_HISTORY:' as data from dual)
SELECT RTRIM(substr(data,instr(data,' ',-1)+1),':') from t
所有消息的新查询:
select replace (replace ( 'Failure on table TOLL_USR_TRXN_HISTORY:
Failure on table DOCUMENT_IMAGES:' , 'Failure on table', ' ' ),':',' ') from dual
你可以直接使用regexp_substr()
:
select regexp_substr(str, '[A-Z_]{3,}', 1, 1, 'c')
from (select 'Failure on table TOLL_USR_TRXN_HISTORY' as str from dual) x;
该模式表示要查找包含大写字母或下划线且至少 3 个字符长的子字符串。 1, 1
表示从第一个位置开始,return 表示第一个匹配。 'c'
使搜索区分大小写。