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

10-88 IPの前ゼロを削除

SQLパズル

IPテーブル
IPAddress
---------------
0.0.001.00
000.000.025.205
001.01.1.0
100.10.01.010
127.20.002.1
192.168.02.100

IPテーブルのIPAddressの前ゼロを削除する

出力結果
IPAddress        前ゼロを削除
---------------  -------------
0.0.001.00       0.0.1.0
000.000.025.205  0.0.25.205
001.01.1.0       1.1.1.0
100.10.01.010    100.10.1.10
127.20.002.1     127.20.2.1
192.168.02.100   192.168.2.100


データ作成スクリプト

create table IP(IPAddress varchar2(15));

insert into IP values('0.0.001.00');
insert into IP values('000.000.025.205');
insert into IP values('001.01.1.0');
insert into IP values('100.10.01.010');
insert into IP values('127.20.002.1');
insert into IP values('192.168.02.100');
commit;


SQL

col "前ゼロを削除" for a16

--■■■to_number関数を使う方法■■■
select IPAddress,
to_char(to_number(
substr(IPAddress,1,instr(IPAddress,'.')-1))) || '.' ||
to_char(to_number(
substr(IPAddress,instr(IPAddress,'.')+1,
                 instr(IPAddress,'.',1,2)-instr(IPAddress,'.')-1))) || '.' ||
to_char(to_number(
substr(IPAddress,instr(IPAddress,'.',1,2)+1,
                 instr(IPAddress,'.',1,3)-instr(IPAddress,'.',1,2)-1))) || '.' ||
to_char(to_number(
substr(IPAddress,instr(IPAddress,'.',1,3)+1))) as "前ゼロを削除"
from IP;

--■■■正規表現を使う方法1■■■
select IPAddress,
to_char(to_number(RegExp_Replace(IPAddress,'^([^.]+).*$','\1'))) || '.' ||
to_char(to_number(RegExp_Replace(IPAddress,'^[^.]+\.([^.]+).*$','\1'))) || '.' ||
to_char(to_number(RegExp_Replace(IPAddress,'^([^.]+\.){2}([^.]+).*$','\2'))) || '.' ||
to_char(to_number(RegExp_Replace(IPAddress,'^([^.]+\.){3}([^.]+).*$','\2'))) as "前ゼロを削除"
from IP;

--■■■正規表現を使う方法2■■■
select IPAddress,
RegExp_Replace(IPAddress,'(^|\.)0+([0-9]+)','\1\2') as "前ゼロを削除"
from IP;


解説

正規表現を使う方法2では、
正規表現のバックトラック機能を使ってます。

EmEditorの場合は、
戻り読みを使う方法があります。
正規表現パズル 3-5 IPの前ゼロを削除