• ベストアンサー

集まり単位?でのソート

FreeBSDに PostgreSQL7.4.6 + Apache + php4.3.10で色々と試していますが データソートのSQLについて悩んでいます 【テーブル(test)】 code name 1001 aaa 1002 bbb 2001 ccc 2002 ddd 3001 eee 4001 fff 【希望】 codeの4桁目基本にグループわけし、 各グループ単位で希望の順番(1,3,4,2)に並べたい グループ内は残り3桁の昇順で並べたい 【希望結果】 1001 aaa 1002 bbb 3001 eee 4001 fff 2001 ccc 2002 ddd

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

列codeのデータ型が示されていませんが、char(4)と仮定します。 >codeの4桁目基本にグループわけ 一般的には、一番左側は「一桁目」と言うと思います。 (1)例1・・・ソートのために、codeの先頭1文字と2文字目から3文字を参照するx、yを作る select code,name, case substr(code,1,1) when '1' then 1 when '3' then 2 when '4' then 3 else 4 end as x, substr(code,2,3) as y from test order by x,y (2)例2・・・ソートのためのx、yを取り出さないようにするため、ビュー経由で操作 (a)ビューの定義 create view v_test as select code,name, case substr(code,1,1) when '1' then 1 when '3' then 2 when '4' then 3 else 4 end as x, substr(code,2,3) as y from test order by x,y (b)操作 select code,name from v_test

moemoe_999
質問者

お礼

アドバイス 有り難うございます 私のスキルが低いので、おおざっぱにしかイメージできません 自分なりに試したところ 下記のSQLで出来ましたので、当面これでいこうと思います しかし、アドバイスいただいたことを 理解できるようにレベルアップも図りたいです -------- SELECT * FROM ( (SELECT code,name FROM test WHERE code LIKE '1%' ORDER BY code) UNION ALL (SELECT code,name FROM test WHERE code LIKE '3%' ORDER BY code) UNION ALL (SELECT code,name FROM test WHERE code LIKE '4%' ORDER BY code) UNION ALL (SELECT code,name FROM test WHERE code LIKE '2%' ORDER BY code) ) AS u

その他の回答 (1)

noname#86752
noname#86752
回答No.1

試していないのでなんともいえませんが、caseとsubstrを使うとなんとかなると思います。 select code,name, (case when substr(code,1,1) = '1' then 1 when substr(code,1,1) = '2' then 4 when substr(code,1,1) = '3' then 2 when substr(code,1,1) = '4' then 3 end) as s from test order by s 参考になればいいのですが・・・。

moemoe_999
質問者

補足

有り難うございます caseを利用するのは思いつきませんでした ただ、substr()で値をとるcodeは sqlの結果で出る値と思うので、もう少し悩んでみます 今、union allも使えないかな? と模索中なので、あわせて悩んでみます

関連するQ&A