Использование 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.

Следует ли извлекать CREATE_ACC_STATEMENT с вашими данными?

Aleksej 07.09.2018 17:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
773
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать такой оператор SQL Select для каждой заменяемой отдельной строки (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_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

что, если строка - «Ошибка в таблице TOLL_USR_TRXN_HISTORY TOLL_USR_TRXN_HISTORY2:» ..? Затем возвращает только TOLL_USR_TRXN_HISTORY2. И нет фильтра для всех прописных букв и подчеркиваний. И возвращает только последнее слово предложения.

Barbaros Özhan 07.09.2018 20:02

Да, Барбаро ... это не сработает. Это выберет только последнее слово

kanagaraj 07.09.2018 20:10

Я обновил запрос для обработки нескольких сообщений ... поскольку сообщения об ошибках являются обычным явлением, я пошел с этим запросом .... но я вижу, что ваш запрос был потрясающим, каким бы он ни был :-)

kanagaraj 07.09.2018 20:26
Ответ принят как подходящий

Вы можете просто использовать 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' делает поиск чувствительным к регистру.

Спасибо, это именно то, что я хочу.

Sibusiso Maphumulo 10.09.2018 09:50

Другие вопросы по теме