使用Oracle REGEXP_SUBSTR提取由下划线分隔的大写数据

时间:2018-09-07 14:48:51

标签: sql oracle regexp-substr

样本列数据:

Failure on table TOLL_USR_TRXN_HISTORY:
Failure on table DOCUMENT_IMAGES:
Error in CREATE_ACC_STATEMENT() [line 16]

我正在寻找一种仅提取由下划线分隔的大写单词(表名)的方法。我想要整个表的名称,最大为3个下划线,最小为1个下划线。我想忽略initcap中的所有大写字母。

3 个答案:

答案 0 :(得分:1)

您可以只使用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表示从第一个位置开始并返回第一个匹配项。 'c'使搜索区分大小写。

答案 1 :(得分:0)

您可以将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;    

答案 2 :(得分:0)

从错误消息中仅获取表名的替代方法,仅当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