Как использовать функцию replace в Oracle для удаления строки?

#oracle #replace

#Oracle #заменить

Вопрос:

В моей таблице у меня есть такие данные, как PAT5DSA-(ALRP), LAR6DAOP-(RAH) и т. Д. Но я хочу удалить строки типа -(xxxx) или -(xxx), которые могут быть любыми алфавитами внутри фигурных скобок. Пробовал использовать приведенное ниже:

 select replace(:code,'-(Aa-Zz)',null) from employee;
  

Но это не сработало .. Кто-нибудь может помочь?

Комментарии:

1. Не уверен, откуда вы взяли этот синтаксис (он напоминает регулярные выражения, но это не так). REPLACE не поддерживает ничего такого необычного.

Ответ №1:

Мы можем выполнить замену регулярных выражений с помощью REGEXP_REPLACE :

 SELECT REGEXP_REPLACE('PAT5DSA-(ALRP)', '-(.*?)', '')
FROM dual;

PAT5DSA
  

Ответ №2:

Равнина replace() не понимает шаблонов. Вы могли бы использовать регулярное выражение replace, например:

 -- CTE for sample data
with cte (code) as (
  select 'PAT5DSA-(ALRP)' from dual
  union all
  select 'LAR6DAOP-(RAH)' from dual
)
select code, regexp_replace(code, '-(.*?)$') as result
from cte;

CODE           RESULT        
-------------- --------------
PAT5DSA-(ALRP) PAT5DSA       
LAR6DAOP-(RAH) LAR6DAOP      
  

Это приведет к удалению всего, что находится внутри пары круглых скобок, перед которыми стоит тире в конце исходной строки. Если удаляемые круглые скобки могут находиться в любом месте строки, удалите $ .

Ответ №3:

Используйте INSTR и SUBSTR :

 WITH cteVals AS (SELECT 'PAT5DSA-(ALRP)' AS COL_VAL FROM DUAL UNION ALL
                 SELECT 'LAR6DAOP-(RAH)' AS COL_VAL FROM DUAL)
SELECT SUBSTR(COL_VAL, 1, INSTR(COL_VAL, '-')-1)
  FROM cteVals;
  

Удачи.