web-dev-qa-db-ja.com

Oracleの文字列内の空白(トリムおよびタブスペース)を削除する

Oracleクエリで新しい行(文字列の先頭と末尾からChr(13)とChr(10)とタブスペース)をトリミングする必要があります。 Oracleで複数の文字をトリムする簡単な方法はないことを学びました。 「トリミング」機能は、単一の文字のみをトリミングします。関数を使用してループでトリム関数を再帰的に呼び出すと、パフォーマンスが低下します。 regexp_replaceが空白に一致し、それらを削除できると聞きました。 regexp_replaceを使用して、文字列の先頭と末尾にある複数のタブスペースまたは改行またはそれらの組み合わせをトリムするための信頼できる方法をご案内できますか。他の方法がある場合は、ご案内ください。

33
Seshan

クイックでダーティな翻訳機能はどうですか?

これにより、string1内の各文字のすべての出現が削除されます。

SELECT translate(
           translate(
               translate(string1, CHR(10), '')
           , CHR(13), '')
       , CHR(09), '') as massaged
FROM BLAH;

Regexp_replaceはオプションですが、式の複雑さによってはパフォーマンスが低下する場合があります。

15
David Mann

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
    )

返却:

  • REGEXP_TESTER_1: "Qqwerqwerqwerqwerty"
  • REGEXP_TESTER_2: "Q qwerqwerqwer qwerty "

これが役に立つことを願っています。

33
Nick Pierpoint

これをどのように実装するのですか:

     REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
19
Marco

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;
9
Gary Myers
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')

「d」はダミー文字です。3番目のパラメーターがNULLの場合、変換は機能しないためです。

4
rcp

Oracleのバージョンは何ですか? 10g +は正規表現をサポートしています。t REGENP_REPLACEの使用方法についてはOTNディスカッションフォーラムのスレッド を参照して、印刷できない文字を''に変更してください。

3
OMG Ponies

これがこの質問に対する厳密な答えではないことはわかっていますが、これらのルールに従ってテキストデータを変換する必要があるいくつかのシナリオで作業しています。

  1. いいえスペースまたはctrl chars文字列の先頭
  2. いいえスペースまたはctrl chars文字列の最後
  3. の複数の通貨スペースまたはctrl charsは単一のspace

以下のコードは上記のルールに従います。

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.
1
jackattack

以下のコードを試してください。単一の列に複数の行を入力すると機能します。

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番目

0
sreeharibabu

regexp_replaceを複数回使用する代わりに、次のように(\s)を使用します。

SELECT regexp_replace('TEXT','(\s)','')
FROM dual;

以下のコードを使用して、テキスト列の新しい行と表スペースを削除できます

Select replace(replace(TEXT,char(10),''),char(13),'')
0
Trilochan Nayak

Oracleソリューションが過度に複雑に思える場合、Javaクラスを静的メソッドで作成し、それをパッケージとしてOracleにインストールします。これはパフォーマンスが劣る可能性がありますが、 Javaフォールバックが有用であることがわかるケース(たとえば、ミリ秒への日付変換)。

0
Alex S
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
0
reeko