43

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

4

15 に答える 15

41

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"

これがお役に立てば幸いです。

于 2010-02-16T17:36:47.247 に答える
37

これは私がそれをどのように実装するかです:

     REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
于 2014-05-07T10:39:01.990 に答える
16

素早く汚い翻訳機能はどうですか?

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

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

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

于 2010-02-15T21:37:27.257 に答える
9

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;
于 2010-02-16T00:23:48.280 に答える
2

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

于 2010-02-15T21:32:47.007 に答える
2

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

  1. 文字列の先頭にスペースctrl 文字はありません
  2. 文字列の末尾にスペースctrl 文字はありません
  3. スペースまたは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.
于 2016-06-30T13:26:13.590 に答える
0

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

Select replace(replace(TEXT,char(10),''),char(13),'')
于 2015-02-04T12:12:27.020 に答える
0
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
于 2016-10-06T07:49:03.433 に答える
0

以下のコードを試してください。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 番目のテスト

于 2016-01-08T02:36:08.337 に答える
0

Oracle ソリューションが複雑すぎると思われる場合は、静的メソッドを使用して Java クラスを作成し、それをパッケージとして Oracle にインストールします。これはそれほどパフォーマンスが高くないかもしれませんが、Java フォールバックが役立つ他のケース (ミリ秒への日付変換など) を最終的に見つけることができます。

于 2010-02-16T16:31:19.360 に答える
0

次のコードは、文字列の両側から改行を削除します。

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
于 2020-11-04T08:28:23.090 に答える