質問: ### 前提・実現したいこと MySQLにて 1F,2F,3F,4F,5F,6F,7F,8F,9F,10F,11F,12F,**M**2F,**M**4F のような値の入った単一カラムにて 1F,2F,**M**2F,3F,4F,**M**4F,5F,6F,7F,8F,9F,10F,11F,12F のように「M + 数字F」の値を数字の羅列間に挿入してソートをしたいです。 ### 発生している問題 Mと数字のカラムを分ければ実現できそうですが、 既存システムへの影響が大きそうなのでカラムの追加をすることはできません。 ### 考えたSQL文 select * case when column like '%1F%' then 1 case when column like '%2F%' then 2 case when column like '%3F%' then 3 case when column like '%4F%' then 4 ・・・ case when column like '%9F%' then 9 else 100 END As Sort_id order by Sort_id asc; では12Fが上に来てしまい思ったようにいきませんでした。 上限が分かれば愚直にそこまで書き並べるということもできそうですが。。 ### 試したこと 試したわけではないですが 書いていて思ったのはMと数字Fを二つのカラムに分けてselectする方法があれば 別カラムでデータが入っている時と同様のソートが出来るのではと思いました。 ### 補足情報(FW/ツールのバージョンなど) MySQL 5.6.16
回答: ``` SELECT `FLOOR` , CASE WHEN `FLOOR` REGEXP 'M[0-9]+F' THEN REPLACE(REPLACE(`FLOOR`, 'M', ''), 'F', '') + 0.5 WHEN `FLOOR` REGEXP '[0-9]+F' THEN REPLACE(`FLOOR`, 'F', '') END AS `floor_order` FROM sample ORDER BY floor_order ```