プロが教えるわが家の防犯対策術!

失礼致します。
質問させてください。

今テーブルに下のように値が入っています。

No 名前
1 そのこ
2 さちえ
3 あやこ
4 ともよ
5 ひろみ
6 うめこ


このテーブルにおいて
名前があ行、か行、さ行の人をNoの昇順で表示し、続けて名前がそれ以外の人のレコードをNoの降順で表示したいです。結果を次のようにしたいです。

2 さちえ
3 あやこ
6 うめこ
5 ひろみ
4 ともよ
1 ののこ

sqlを2回発行するのは避けたいです。
ヒントだけでもいいので教えてください。
よろしくお願いします。m(__)m

A 回答 (3件)

希望の検索結果を得られるSQL例を示します。



このSQLでは、、、
(1)あ行、か行、さ行で始まる名前の場合は、10000-No(つまりNoが小さいほど、大きな数字になる)をソートで使用
(2)あ行、か行、さ行以外で始まる名前の場合は、Noをソートで使用

という方法を取り、ソートは降順にしています。
これにより、(1)のケースはNoの昇順、(2)のケースはNoの降順が簡単なSQLで実現できます。

【SQL例】
select No,名前
from t1
order by
case
when substr(名前,1) between 'あ' and 'そ' then 10000-No
else No
end desc
;
    • good
    • 0
この回答へのお礼

難か難しそうですが、おっしゃっていることは分かります。
関連する10000-Noのところを勉強してみます。
ありがとうございました。m(__)m

また、質問の件なのですが、
SQL = (select No, Name from t1 where Name = *** order by No ASC) union (select No,Name from t1 where Name = *****)
という形で解決しました。
()でくくるのが例題からはなかなか見抜けず手間取りました。

お礼日時:2006/08/08 17:32

あとはテンポラリに流し込むとかもありますね。



CREATE TEMPORARY TABLE `TEMP`
SELECT `No`,`名前`
FROM `テーブル`
WHERE SUBSTRING(`名前`,1,1) BETWEEN 'あ' AND 'そ'
ORDER BY `名前` ASC;
INSERT INTO `TEMP`
SELECT `No`,`名前`
FROM `テーブル`
WHERE NOT(SUBSTRING(`名前`,1,1) BETWEEN 'あ' AND 'そ')
ORDER BY `名前` DESC;
SELECT * FROM `TEMP`;
    • good
    • 0

これはやっぱりSELECT文とSELECT文をUNIONでつなぐしかないでしょう。

この回答への補足

やっぱりないですかあ~(泣
そのunionというのを勉強してみます。
unionでつなぐのと、
出てきたデータをひとつのベクターにまとめるのと
どちらがいいでしょうか??
特にひとつのテーブルで表示させたいというところに
こだわった場合どうなりますか?
よろしくお願いします。m(__)m

補足日時:2006/08/04 01:33
    • good
    • 0

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