Подтвердить что ты не робот

Oracle PL/SQL: удалить символы пробела из строки

В моей базе данных Oracle 10g я хотел бы удалить "пробельные символы" (пробелы, табуляции, возврат каретки...) из значений поля таблицы.

Есть ли TRANSLATE() путь? Например, что-то вроде:

MY_VALUE := TRANSLATE(MY_VALUE,
  CHR(9) || CHR(10) || CHR(11) || CHR(12) || CHR(13) || ' ', '');

Или есть ли лучшая альтернатива (что-то вроде [:space:] в PHP PCRE)?

Спасибо за любой совет.

4b9b3361

Ответ 1

Я бы пошел на regexp_replace, хотя я не уверен на 100%, что это можно использовать в PL/SQL

my_value := regexp_replace(my_value, '[[:space:]]*',''); 

Ответ 2

Более короткая версия:

REGEXP_REPLACE( my_value, '[[:space:]]', '' )

Будет:

REGEXP_REPLACE( my_value, '\s')

Ни один из вышеприведенных операторов не удаляет символы "null".

Чтобы удалить "nulls", заключите оператор с заменой

Так же:

REPLACE(REGEXP_REPLACE( my_value, '\s'), CHR(0))

Ответ 3

Поскольку вам удобно использовать регулярные выражения, вы, вероятно, захотите использовать функцию 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

Ответ 4

select regexp_replace('This is a test   ' || chr(9) || ' foo ', '[[:space:]]', '') from dual;

REGEXP_REPLACE
--------------
Thisisatestfoo

Ответ 5

Чтобы удалить любые пробелы, которые вы могли бы использовать:

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 '% %'

Ответ 6

Чтобы заменить один или несколько символов пробела на один пробел, вы должны использовать {2,} вместо *, иначе вы бы insert пробел между всеми непустыми символами.

REGEXP_REPLACE( my_value, '[[:space:]]{2,}', ' ' )