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

10-331 可変個のカンマ区切りの数字でソート

SQLパズル

ordテーブル
Val
--------
4,7,10
4,7,8
5,6,11
4,7,10
4,7,99,4
4,7,6
4,7,7

カンマで区切られた可変個の数字を数値をみなしてソートするために、
それぞれの数字の左に0埋めして6桁になるようにする。

出力結果
Val       NewVal
--------  ---------------------------
4,7,6     000004,000007,000006
4,7,7     000004,000007,000007
4,7,8     000004,000007,000008
4,7,10    000004,000007,000010
4,7,99,4  000004,000007,000099,000004
5,6,11    000005,000006,000011

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table ord(Val) as
select '4,7,10'   from dual union
select '4,7,8'    from dual union
select '5,6,11'   from dual union
select '4,7,10'   from dual union
select '4,7,99,4' from dual union
select '4,7,6'    from dual union
select '4,7,7'    from dual;


SQL

col NewVal for a30

select Val,
RegExp_Replace(RegExp_Replace(Val,'([0-9]+)','000000\1')
              ,'0+([0-9]{6})','\1') as NewVal
from ord
order by NewVal;


解説

正規表現のマッチのしくみを脳内でイメージすると分かりやすいでしょう。
Oracle11gR2の次のバージョンで、正規表現で先読みや戻り読みが使えるようになりませんかねぇ

US-OTN --- Order by Bulleted Numbers