Ответ 1
Я бы пошел на regexp_replace, хотя я не уверен на 100%, что это можно использовать в PL/SQL
my_value := regexp_replace(my_value, '[[:space:]]*','');
В моей базе данных Oracle 10g я хотел бы удалить "пробельные символы" (пробелы, табуляции, возврат каретки...) из значений поля таблицы.
Есть ли TRANSLATE()
путь? Например, что-то вроде:
MY_VALUE := TRANSLATE(MY_VALUE,
CHR(9) || CHR(10) || CHR(11) || CHR(12) || CHR(13) || ' ', '');
Или есть ли лучшая альтернатива (что-то вроде [:space:]
в PHP PCRE)?
Спасибо за любой совет.
Я бы пошел на regexp_replace, хотя я не уверен на 100%, что это можно использовать в PL/SQL
my_value := regexp_replace(my_value, '[[:space:]]*','');
Более короткая версия:
REGEXP_REPLACE( my_value, '[[:space:]]', '' )
Будет:
REGEXP_REPLACE( my_value, '\s')
Ни один из вышеприведенных операторов не удаляет символы "null".
Чтобы удалить "nulls", заключите оператор с заменой
Так же:
REPLACE(REGEXP_REPLACE( my_value, '\s'), CHR(0))
Поскольку вам удобно использовать регулярные выражения, вы, вероятно, захотите использовать функцию REGEXP_REPLACE. Если вы хотите исключить все, что соответствует классу [: space:] POSIX
REGEXP_REPLACE( my_value, '[[:space:]]', '' )
SQL> ed
Wrote file afiedt.buf
1 select '|' ||
2 regexp_replace( 'foo ' || chr(9), '[[:space:]]', '' ) ||
3 '|'
4* from dual
SQL> /
'|'||
-----
|foo|
Если вы хотите оставить одно место для каждого набора символов непрерывного пробела, просто добавьте +
в регулярное выражение и используйте пробел в качестве символа замены.
with x as (
select 'abc 123 234 5' str
from dual
)
select regexp_replace( str, '[[:space:]]+', ' ' )
from x
select regexp_replace('This is a test ' || chr(9) || ' foo ', '[[:space:]]', '') from dual;
REGEXP_REPLACE
--------------
Thisisatestfoo
Чтобы удалить любые пробелы, которые вы могли бы использовать:
myValue := replace(replace(replace(replace(replace(replace(myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13));
Пример: удалить все пробелы в таблице:
update myTable t
set t.myValue = replace(replace(replace(replace(replace(replace(t.myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13))
where
length(t.myValue) > length(replace(replace(replace(replace(replace(replace(t.myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13)));
или
update myTable t
set t.myValue = replace(replace(replace(replace(replace(replace(t.myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13))
where
t.myValue like '% %'
Чтобы заменить один или несколько символов пробела на один пробел, вы должны использовать {2,}
вместо *
, иначе вы бы insert
пробел между всеми непустыми символами.
REGEXP_REPLACE( my_value, '[[:space:]]{2,}', ' ' )