#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;
Удачи.