Oracle 10gデータベースでは、テーブルフィールドの値から「スペース文字」(スペース、タブ、キャリッジリターンなど)を削除したいと思います。
TRANSLATE()
は進むべき道ですか?たとえば、次のようなものです。
MY_VALUE := TRANSLATE(MY_VALUE,
CHR(9) || CHR(10) || CHR(11) || CHR(12) || CHR(13) || ' ', '');
または、より良い代替手段がありますか([:space:]
in PHP PCRE)?
アドバイスをありがとう。
Regexp_replaceに行きますが、これがPL/SQLで使用できるかどうかは100%確信できませんが
my_value := regexp_replace(my_value, '[[:space:]]*','');
短縮版:
REGEXP_REPLACE( my_value, '[[:space:]]', '' )
だろう:
REGEXP_REPLACE( my_value, '\s')
上記のいずれのステートメントも「ヌル」文字を削除しません。
「ヌル」を削除するには、ステートメントを置換で囲みます
そのようです:
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|
連続するスペース文字のセットごとに1つのスペースを残したい場合は、+
を正規表現に追加し、スペースを置換文字として使用します。
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
1つ以上の空白文字を単一の空白で置き換えるには、{2,}
の代わりに*
を使用する必要があります。そうでない場合は、すべての非空白文字の間にinsert
空白を入れます。
REGEXP_REPLACE( my_value, '[[:space:]]{2,}', ' ' )
空白を削除するには、次を使用できます。
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 '% %'