プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (2件)

試していないのでなんともいえませんが、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

参考になればいいのですが・・・。

この回答への補足

有り難うございます
caseを利用するのは思いつきませんでした

ただ、substr()で値をとるcodeは
sqlの結果で出る値と思うので、もう少し悩んでみます

今、union allも使えないかな?
と模索中なので、あわせて悩んでみます

補足日時:2006/03/18 10:56
    • good
    • 0

列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
    • good
    • 0
この回答へのお礼

アドバイス 有り難うございます
私のスキルが低いので、おおざっぱにしかイメージできません

自分なりに試したところ
下記の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

お礼日時:2006/03/18 13:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!