Oracle PL / SQL: удалить «пробелы» из строки - PullRequest
21 голосов
/ 01 апреля 2011

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

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

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

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

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

Ответы [ 6 ]

38 голосов
/ 01 апреля 2011

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

my_value := regexp_replace(my_value, '[[:space:]]*',''); 
13 голосов
/ 16 июля 2013

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

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

Будет:

REGEXP_REPLACE( my_value, '\s')

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

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

Примерно так:

REPLACE(REGEXP_REPLACE( my_value, '\s'), CHR(0))
7 голосов
/ 01 апреля 2011

Поскольку вам удобны регулярные выражения, вы, вероятно, захотите использовать функцию REGEXP_REPLACE. Если вы хотите исключить все, что соответствует классу POSIX [: space:]

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
2 голосов
/ 01 апреля 2011
select regexp_replace('This is a test   ' || chr(9) || ' foo ', '[[:space:]]', '') from dual;

REGEXP_REPLACE
--------------
Thisisatestfoo
1 голос
/ 20 октября 2015

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

REGEXP_REPLACE( my_value, '[[:space:]]{2,}', ' ' )
1 голос
/ 08 ноября 2011

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

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 '% %'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...