Oracleクエリで新しい行(文字列の先頭と末尾からChr(13)とChr(10)とタブスペース)をトリミングする必要があります。 Oracleで複数の文字をトリムする簡単な方法はないことを学びました。 「トリミング」機能は、単一の文字のみをトリミングします。関数を使用してループでトリム関数を再帰的に呼び出すと、パフォーマンスが低下します。 regexp_replaceが空白に一致し、それらを削除できると聞きました。 regexp_replaceを使用して、文字列の先頭と末尾にある複数のタブスペースまたは改行またはそれらの組み合わせをトリムするための信頼できる方法をご案内できますか。他の方法がある場合は、ご案内ください。
クイックでダーティな翻訳機能はどうですか?
これにより、string1内の各文字のすべての出現が削除されます。
SELECT translate(
translate(
translate(string1, CHR(10), '')
, CHR(13), '')
, CHR(09), '') as massaged
FROM BLAH;
Regexp_replaceはオプションですが、式の複雑さによってはパフォーマンスが低下する場合があります。
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)
regexpは、非印刷文字とタブを削除します。
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
)
返却:
Qqwerqwerqwerqwerty
"Q qwerqwerqwer qwerty
"これが役に立つことを願っています。
これをどのように実装するのですか:
REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
LTRIMとRTRIMの両方を使用できます。
select rtrim(ltrim('abcdab','ab'),'ab') from dual;
CHR(10)が付属している場合にのみCHR(13)をトリミングする場合は、より複雑になります。まず、結合された文字列を単一の文字に変換しました。次に、その文字をLTRIM/RTRIMし、単一の文字を結合された文字列に戻します。
select replace(rtrim(ltrim(replace('abccccabcccaab','ab','#'),'#'),'#'),'#','ab') from dual;
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')
「d」はダミー文字です。3番目のパラメーターがNULLの場合、変換は機能しないためです。
Oracleのバージョンは何ですか? 10g +は正規表現をサポートしています。t REGENP_REPLACEの使用方法についてはOTNディスカッションフォーラムのスレッド を参照して、印刷できない文字を''
に変更してください。
これがこの質問に対する厳密な答えではないことはわかっていますが、これらのルールに従ってテキストデータを変換する必要があるいくつかのシナリオで作業しています。
以下のコードは上記のルールに従います。
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.
以下のコードを試してください。単一の列に複数の行を入力すると機能します。
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番目
regexp_replace
を複数回使用する代わりに、次のように(\s)
を使用します。
SELECT regexp_replace('TEXT','(\s)','')
FROM dual;
以下のコードを使用して、テキスト列の新しい行と表スペースを削除できます
Select replace(replace(TEXT,char(10),''),char(13),'')
Oracleソリューションが過度に複雑に思える場合、Javaクラスを静的メソッドで作成し、それをパッケージとしてOracleにインストールします。これはパフォーマンスが劣る可能性がありますが、 Javaフォールバックが有用であることがわかるケース(たとえば、ミリ秒への日付変換)。
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)