Oracle クエリで改行 (文字列の先頭と末尾から Chr(13) と Chr(10) とタブ スペース) を削除する必要があります。Oracle で複数の文字をトリミングする簡単な方法がないことを知りました。「トリム」機能は、単一の文字のみをトリムします。関数を使用してループ内でトリム関数を再帰的に呼び出すと、パフォーマンスが低下します。regexp_replace は空白を一致させて削除できると聞きました。regexp_replace を使用して、文字列の最初と最後で複数のタブスペースまたは新しい行、またはそれらの組み合わせをトリミングする信頼できる方法をガイドできますか。他の方法があれば、私を案内してください。
15 に答える
Oracle 10gを使用している場合、REGEXP_REPLACEは非常に柔軟です。
次の文字列をテストとして使用します。
chr(9) || 'Q qwer' || chr(9) || chr(10) ||
chr(13) || 'qwerqwer qwerty' || chr(9) ||
chr(10) || chr(13)
はすべての[[:space:]]
空白を削除し、([[:cntrl:]])|(^\t)
正規表現は印刷されない文字とタブを削除します。
select
tester,
regexp_replace(tester, '(^[[:space:]]+)|([[:space:]]+$)',null)
regexp_tester_1,
regexp_replace(tester, '(^[[:cntrl:]^\t]+)|([[:cntrl:]^\t]+$)',null)
regexp_tester_2
from
(
select
chr(9) || 'Q qwer' || chr(9) || chr(10) ||
chr(13) || 'qwerqwer qwerty' || chr(9) ||
chr(10) || chr(13) tester
from
dual
)
戻る:
- REGEXP_TESTER_1: "
Qqwerqwerqwerqwerty
" - REGEXP_TESTER_2: "
Q qwerqwerqwer qwerty
"
これがお役に立てば幸いです。
これは私がそれをどのように実装するかです:
REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
素早く汚い翻訳機能はどうですか?
これにより、string1 内の各文字の出現箇所がすべて削除されます。
SELECT translate(
translate(
translate(string1, CHR(10), '')
, CHR(13), '')
, CHR(09), '') as massaged
FROM BLAH;
Regexp_replace はオプションですが、式の複雑さによってはパフォーマンスが低下する場合があります。
LTRIM と RTRIM の両方を使用できます。
select rtrim(ltrim('abcdab','ab'),'ab') from dual;
CHR(10) が付属している場合にのみ CHR(13) をトリミングする場合は、さらに複雑になります。まず、結合された文字列を 1 つの文字に変換しました。次に、その文字を LTRIM/RTRIM し、単一の文字を結合文字列に戻します。
select replace(rtrim(ltrim(replace('abccccabcccaab','ab','#'),'#'),'#'),'#','ab') from dual;
Oracle のどのバージョンに対応していますか? 10g+ は正規表現をサポートしています - REGEXP_REPLACE を使用して印刷できない文字を に変更する方法については、OTN ディスカッション フォーラムのスレッドを参照してください''
。
これがこの質問に対する厳密な答えではないことは承知していますが、次の規則に従ってテキスト データを変換する必要があるいくつかのシナリオで作業してきました。
- 文字列の先頭にスペースやctrl 文字はありません
- 文字列の末尾にスペースやctrl 文字はありません
- スペースまたはctrl 文字が複数出現すると、1 つのスペースに置き換えられます
以下のコードは、上記のルールに従います。
WITH test_view AS (
SELECT CHR(9) || 'Q qwer' || CHR(9) || CHR(10) ||
CHR(13) || ' qwerqwer qwerty ' || CHR(9) ||
CHR(10) || CHR(13) str
FROM DUAL
) SELECT
str original
,TRIM(REGEXP_REPLACE(str, '([[:space:]]{2,}|[[:cntrl:]])', ' ')) fixed
FROM test_view;
ORIGINAL FIXED
---------------------- ----------------------
Q qwer Q qwer qwerqwer qwerty
qwerqwer qwerty
1 row selected.
以下のコードを使用して、テキスト列の改行と表スペースを削除できます
Select replace(replace(TEXT,char(10),''),char(13),'')
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
以下のコードを試してください。1 つの列に複数の行を入力すると機能します。
create table products (prod_id number , prod_desc varchar2(50));
insert into products values(1,'test first
test second
test third');
select replace(replace(prod_desc,chr(10),' '),chr(13),' ') from products where prod_id=2;
出力 : 最初のテスト 2 番目のテスト 3 番目のテスト
Oracle ソリューションが複雑すぎると思われる場合は、静的メソッドを使用して Java クラスを作成し、それをパッケージとして Oracle にインストールします。これはそれほどパフォーマンスが高くないかもしれませんが、Java フォールバックが役立つ他のケース (ミリ秒への日付変換など) を最終的に見つけることができます。
次のコードは、文字列の両側から改行を削除します。
select ltrim(rtrim('asbda'||CHR(10)||CHR(13) ,''||CHR(10)||CHR(13)),''||CHR(10)||CHR(13)) from dual
しかし、ほとんどの場合、これで十分です:
select rtrim('asbda'||CHR(10)||CHR(13) ,''||CHR(10)||CHR(13))) from dual