トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

7-17 連続した空白を一つに置換

SQLパズル

This    is                    my pen.
の連続した半角スペースを、一つに置換する。
最大で20個の半角スペースが連続する。

置換後の文字列
This is my pen.


SQL

--■■■正規表現を使用する方法(10g以降)■■■
select
RegExp_Replace('This    is                    my pen.',' {2,}',' ')
from dual;

--■■■Replace関数を使用する方法1■■■
select
replace(
replace(
replace('This    is                    my pen.'
       ,' ',' ' || '禁則文字')
       ,'禁則文字' || ' ')
       ,'禁則文字')
from dual;

--■■■Replace関数を使用する方法2■■■
select
Replace(
    Replace(
        Replace(
            Replace(
                Replace('This    is                    my pen.','  ',' '),
            '  ',' '),
        '  ',' '),
    '  ',' '),
'  ',' ')
from dual;


解説

Replace関数を使用する方法2では、
最大で20個の半角スペースが連続するので、
Replace関数で、
Log2の20(約4.32)の小数を切り上げた数の回数分(5回)、空白2文字を1文字に置換してます。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Replace関数を使用する方法1についての考察

case1
AAAAAAAAAAAAAAAAAAAAAAAAA
replace AA to AB
ABABABABABABABABABABABABA
remove BA
A
remove B
A

case2
AAAAAAAAAAAAAAAAAAAAAAAA
replace AA to AB
ABABABABABABABABABABABAB
remove BA
AB
remove B
A

case3
A
replace AA to AB
A
remove BA
A
remove B
A

case4
AA
replace AA to AB
AB
remove BA
AB
remove B
A

Replace multiple whitespaces in a string with single one