Хочу получить все после 2-го столкновения специального персонажа - PullRequest
0 голосов
/ 20 сентября 2019

Здесь O пытается получить abc999998_-1 из приведенной ниже строки.

MG-999998-abc999998_-1

Все после второго появления специального символа (дефис).Может кто-нибудь помочь мне с получением этой строки?

Спасибо

Пробовал ниже, но он дает до последнего дефиса, но я хочу все после 2-го дефиса.

set serveroutput on;
declare
l_temp_val varchar2(100) := 'MG-999998-abc999998_-1';
l_invoice_num varchar2(100);
begin
select DECODE(substr(substr(l_temp_val,3),1,1),'-',
            regexp_substr(l_temp_val,'[^-]+',1,3),
            regexp_substr(l_temp_val,'[^-]+',1,2) ) 
    into l_invoice_num  from dual;
dbms_output.put_line(l_invoice_num);
end;
/

Ответы [ 3 ]

1 голос
/ 20 сентября 2019

Просто используйте INSTR( value, '-', 1, 2 ), чтобы найти индекс второго вхождения символа дефиса, начиная с первого символа строки;затем, если найдено ненулевое совпадение, вы можете получить подстроку, начиная со следующего индекса.

Вам также не нужно использовать оператор SELECT.

declare
  l_temp_val varchar2(100) := 'MG-999998-abc999998_-1';
  l_invoice_num varchar2(100);
begin
  l_invoice_num := CASE
                   WHEN INSTR( l_temp_val, '-', 1, 2 ) > 0
                   THEN SUBSTR( l_temp_val, INSTR( l_temp_val, '-', 1, 2 ) + 1 )
                   END;
  dbms_output.put_line(l_invoice_num);
end;
/

Выход :

abc999998_-1

дБ <> скрипка здесь

1 голос
/ 20 сентября 2019

Вы можете использовать REGEXP_REPLACE для замены первой группы символов, дефиса, второй группы символов и дефиса на Nothing, как указано ниже

SQL> SELECT
  2      REGEXP_REPLACE('MG-999998-abc999998_-1', '^[^-]+-[^-]+-', ' ')
  3  FROM
  4      DUAL;

REGEXP_REPLAC
-------------
 abc999998_-1

SQL>
SQL> SELECT
  2      REGEXP_REPLACE('MG-999998-second test-abc999998_-1', '^[^-]+-[^-]+-', ' ')
  3  FROM
  4      DUAL;

REGEXP_REPLACE('MG-999998
-------------------------
 second test-abc999998_-1

SQL>

Cheers !!

1 голос
/ 20 сентября 2019

Вы можете сделать это легко с помощью функции REGEXP_INSTR .

Попробуйте это:

set serveroutput on;
declare
l_temp_val varchar2(100) := 'MG-999998-abc999998_-1';
l_invoice_num integer;
begin
select REGEXP_INSTR(l_temp_val, '-', 1, 2)
    into l_invoice_num  from dual;
dbms_output.put_line(substr(l_temp_val, l_invoice_num+1));
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...