web-dev-qa-db-ja.com

Oracle PL / SQL:文字列から「スペース文字」を削除します

Oracle 10gデータベースでは、テーブルフィールドの値から「スペース文字」(スペース、タブ、キャリッジリターンなど)を削除したいと思います。

TRANSLATE()は進むべき道ですか?たとえば、次のようなものです。

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

または、より良い代替手段がありますか([:space:] in PHP PCRE)?

アドバイスをありがとう。

21
Frosty Z

Regexp_replaceに行きますが、これがPL/SQLで使用できるかどうかは100%確信できませんが

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

短縮版:

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

だろう:

REGEXP_REPLACE( my_value, '\s')

上記のいずれのステートメントも「ヌル」文字を削除しません。

「ヌル」を削除するには、ステートメントを置換で囲みます

そのようです:

REPLACE(REGEXP_REPLACE( my_value, '\s'), CHR(0))
13
Lord Gordoff

正規表現に慣れているので、おそらく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|

連続するスペース文字のセットごとに1つのスペースを残したい場合は、+を正規表現に追加し、スペースを置換文字として使用します。

with x as (
  select 'abc 123  234     5' str
    from dual
)
select regexp_replace( str, '[[:space:]]+', ' ' )
  from x
7
Justin Cave
select regexp_replace('This is a test   ' || chr(9) || ' foo ', '[[:space:]]', '') from dual;

REGEXP_REPLACE
--------------
Thisisatestfoo
2
ggiroux

1つ以上の空白文字を単一の空白で置き換えるには、{2,}の代わりに*を使用する必要があります。そうでない場合は、すべての非空白文字の間にinsert空白を入れます。

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

空白を削除するには、次を使用できます。

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