Извлечение подстроки из заданной строки - PullRequest
1 голос
/ 10 октября 2011

У меня есть следующие данные

1)MAXO_INSTR_INTERFACE    
2)MAXIS_VENDOR_INTERFACE
3)MAXIMOS_EMPS_INTERFACE2

Мне нужно извлечь строку, которая находится между двумя подчеркиваниями в PL / SQL, как

INPUT                    EXPECTED OUTPUT
------------------------ ---------------
MAXO_INSTR_INTERFACE     INSTR   
MAXIS_VENDOR_INTERFACE   VENDOR  
MAXIMOS_EMPS_INTERFACE2  EMPS

Я пытался использовать функцию подстроки, но не могу выполнить точно.

Ответы [ 3 ]

5 голосов
/ 10 октября 2011

Несколько более простое регулярное выражение:

SQL> with t as
  2  ( select 'maxo_instr_interface' as txt from dual union all
  3    select 'maxis_vendor_interface' from dual union all
  4    select 'maximos_emps_interface2' from dual
  5  )
  6  select txt
  7       , regexp_substr(txt,'[^_]+',1,2)
  8    from t
  9  /

TXT                     REGEXP_SUBSTR(TXT,'[^_]
----------------------- -----------------------
maxo_instr_interface    instr
maxis_vendor_interface  vendor
maximos_emps_interface2 emps

3 rows selected.

С уважением,
Роб.

3 голосов
/ 10 октября 2011

С SUBSTR:

with strings as (
  select 'MAXO_INSTR_INTERFACE' as string from dual
  union all
  select 'MAXIS_VENDOR_INTERFACE' from dual
  union all
  select 'MAXIMOS_EMPS_INTERFACE2' from dual
)
select substr(string,
              instr(string, '_', 1, 1) + 1,
              instr(string, '_', 1, 2) - instr(string, '_', 1, 1) - 1
              ) as substr from strings;

Возвращает:

SUBSTR
---------------------------------------------------------------------
INSTR
VENDOR
EMPS

Но решение с регулярным выражением легче понять.

Вопрос также имеет тег PL / SQL:

create or replace function f (p_str in varchar2) return varchar2 as
  v_begin constant pls_integer := instr(p_str, '_', 1, 1) + 1;
  v_len constant pls_integer := instr(p_str, '_', 1, 2) - v_begin;
begin
  return substr(p_str, v_begin, v_len);
end;

Возвращает:

begin
  dbms_output.put_line(f('MAXO_INSTR_INTERFACE'));
  dbms_output.put_line(f('MAXIS_VENDOR_INTERFACE'));
  dbms_output.put_line(f('MAXIMOS_EMPS_INTERFACE2'));
end;
/

INSTR
VENDOR
EMPS

PL/SQL procedure successfully completed.
1 голос
/ 10 октября 2011

Это вернет строку между подчеркиванием:

WITH t AS (SELECT 'MAXO_INSTR_INTERFACE' AS txt FROM DUAL
           UNION
           SELECT 'MAXIS_VENDOR_INTERFACE' AS txt FROM DUAL
           UNION
           SELECT 'MAXIMOS_EMPS_INTERFACE2' AS txt FROM DUAL) 
SELECT REGEXP_REPLACE( txt, '(^.*\_)([[:alnum:]]*)(\_.*$)', '\2' )
  FROM t;

Возвращает:

INSTR  
VENDOR
EMPS 

Регулярное выражение REGEXP_REPLACE( txt, '(^.*\_)([[:alnum:]]*)(\_.*$)', '\2' ) ищет первое подчеркивание, затем любые буквенно-цифровые символы до следующего подчеркивания, наконец, оставшуюся часть ввода перед тем, как заменить все на второй найденный раздел (т. Е. Раздел между подчеркиваниями).

Если между подчеркиванием в тексте будут пробелы, используйте REGEXP_REPLACE( txt, '(^.*\_)(([[:alnum:]]|[[:space:]])*)(\_.*$)', '\2' ), для полного уменьшения возможностей сопоставления с REGEXP есть хорошая статья:

http://orafaq.com/node/2404

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...