やりたいこと
今回行いことは文字列型カラムの並び替えです。
数値型のカラムに以下のようなデータが入っています。
# code 3B 12D XXX 0A 1C
このデータに以下のようなソートをかけたいです。
# code 0A 1C 3B 12D XXX
現状
このような形で数値から始まるものと文字列のものを分けて、数値から始まるものは数値型にcastしてorder
文字から始まるものは文字でorder、その後結合をおこなっています。
SQL
1"(SELECT * FROM table 2WHERE `code` REGEXP '^[0-9]' 3ORDER BY cast(`code` as UNSIGNED) ,`code`) 4UNION 5(SELECT * FROM table 6WHERE `code` NOT REGEXP '^[0-9]' 7ORDER BY `code`)"
問題点
UNION後にUNION前のorderが保証されないようでして、順番が結局ぐちゃぐちゃにいなってしまうことがあります。
アプリケーション側でそれぞれSQLを打って結合する方法はありますが、SQL1回で綺麗に行える方法があればご教授願いたいです。
追記
検証中はMysql8で行っていたので、ベストアンサーのもので問題なく動きましたが、本番環境がMysql5.7でWindow関数(ROW_NUMBER)が動かなかったため、もう片方の回答で行いました。
結論のコード残しときます。
SELECT *, CASE WHEN code REGEXP '^[0-9]' THEN cast(code AS UNSIGNED) ELSE 9999 END reg FROM table ORDER BY reg, code"
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/01 06:22