Для удаления управляющих символов (не отображаемых) можно использовать регулярные выражения:
- REGEXP_LIKE — для поиска значений с управляющими символами
- REGEXP_REPLACE — для удаления управляющих символов
select str, regexp_replace(t.str, '[[:cntrl:]]') as new_str
from (
select 'test1'||chr(28) as str from dual
union all
select 'test2' from dual
union all
select 'test3+_*- =\\\|()^%#3@' from dual
) t
where regexp_like(t.str, '[[:cntrl:]]')
STR NEW_STR
---------------------- ----------------------
test1 test1
Пример использования регулярного выражения (regexp_replace)
— оставить только буквы
— оставить только цифры
with t as (select '#2 apps(0_-ORACLE+*.ru_ )ПРИ13мер' str from dual)
select str
, regexp_replace(str,'[^[[:alpha:]]]*') as only_char
, regexp_replace(str,'[^[[:digit:]]]*') as only_number
from t
/
STR ONLY_CHAR ONLY_NUMBER
--------------------------------- ------------------------ --------------------
#2 apps(0_-ORACLE+*.ru_ )ПРИ13мер appsORACLEruПРИмер 2013
Для замены N-ного символа в строке, можно обойтись и без SUBSTR — использовать REGEXP_REPLACE.
select regexp_replace('208010100000','.','X', 5, 1) as res from dual
union all
select regexp_replace('208010100000','.','X', 2, 1) as res from dual;
RES
------------
2080X0100000
2X8010100000
Для строки «asdfdasf,abs@dev, sdfasdf» надо найти вхождение «abs@» и заменить на «abs@fn», но только в том случае, если перед вхождением запятая или пробел.
select regexp_replace(str, '([, ]abs@)', '\1fn') as val
from (select 'aabs@sdfdasf,abs@dev, sd abs@fasdf' str from dual)
--
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as apps
SQL> select regexp_replace(str, '([, ]abs@)', '\1fn') as val
2 from (select 'aabs@sdfdasf,abs@dev, sd abs@fasdf' str from dual);
VAL
--------------------------------------
aabs@sdfdasf,abs@fndev, sd abs@fnfasdf
SQL>
Регулярные выражения произошли из теорий автоматов и формальных языков, поэтому поначалу производят устрашающее впечатление. Однако, их базовые понятия являются простыми и в то же время мощными.
Начиная с версии Oracle 10g регулярные выражения можно использовать напрямую в SQL запросах.
Шаблон регулярных выражений выражается в виде строки, содержащей следующие конструкции:
- Литеральные символы. Фактические символы, которые следует искать (Например, шаблон xyz соответствует только вхождению «xyz»)
- Метасимволы. Операции, определяющие алгоритмы, которые должны применяться во время поиска (Например, шаблон ^xyz соответсвует только строке, начинающейся с «xyz» — другие вхождения не учитываются)
Читать дальше про “Регулярные выражения Oracle (regular expression)” »
with t as (
select 1 id, 'a s sfd' info from dual
union all
select 2 id, 'a b; g;g ;g f' info from dual
union all
select 3 id, 'a ' info from dual
union all
select 4 id, ' ' info from dual
)
SELECT id, REGEXP_REPLACE(TRIM(info), ' *', ' ') AS info_new FROM t
ORDER BY id;
Пример:
ID INFO_NEW
---------- --------------------------------------------------------------------------------
1 a s sfd
2 a b; g;g ;g f
3 a
4
Последние комментарии