Достаточно простого CASE
, чтобы удалить начальные и окончания скобки
with txt as (
select '(xxxx)' txt from dual union all
select '(x(x)xx)' txt from dual union all
select '(xxxx' txt from dual union all
select 'xxxx)' txt from dual union all
select 'xxxx' txt from dual)
select txt,
case when txt like '(%)' then
substr(txt,2,length(txt)-2)
else
txt
end as new_txt
from txt
дает
TXT NEW_TXT
-------- --------
(xxxx) xxxx
(x(x)xx) x(x)xx
(xxxx (xxxx
xxxx) xxxx)
xxxx xxxx
В качестве альтернативы вы может использовать REGEXP
следующим образом
select
txt,
nvl(
REGEXP_SUBSTR(txt, '^\((.*)\)$', 1, 1, null, 1),
txt)
as txt_new
from txt
В регулярном выражении '^\((.*)\)$'
применяется начальная и конечная скобка и возвращается часть между первой группой (пятый параметр REGEXP_SUBSTR).
In регистр возврата REGEXP_SUBSTR, т. е. выражение не заключено в квадратные скобки NVL
возвращает исходное значение.