Как убрать только открывающую и закрывающую скобку из строки в oracle? - PullRequest
2 голосов
/ 06 марта 2020

У меня есть такая строка:

(1/8-дюймовая крышка TBE ASME B1.20.1 (NPT) Мужской x Fem CL400 CU Сплав B152 Gr C10400 Цементная подкладка)

Мне нужен выход, подобный этому:

1/8-дюймовая крышка TBE ASME B1.20.1 (NPT) Мужской x Fem CL400 CU Сплав B152 Gr C10400 Подкладка из цемента

т.е. удаляйте только скобки в начале и конце, а не в середине.

Также, если строка такая, с начальной или закрывающей скобкой

(1/8 дюйма TBE ASME B1.20.1 (NPT) Мужской x Fem CL400 Сплав CU B152 Гр C10400 Цементная облицовка

или

1/8-дюймовая крышка TBE ASME B1.20.1 (NPT) Мужской x Fem CL400 CU Alloy B152 Gr C10400 с цементной подкладкой)

, затем не снимайте скобки.

Я пытался использовать regexp_replace, но не смог найти решение. Любая помощь будет заметна

1 Ответ

3 голосов
/ 06 марта 2020

Достаточно простого 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 возвращает исходное значение.

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