こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

テーブルのソート

postgresqlでソートする処理があります。

データとして、例えば、項目名をgrp,data とするとして

grp,data

0,あああ
1,いいい
3,ううう
0,えええ
5,おおお
0,かかか
0,ききき
2,くくく

というようなデータを

1,いいい
3,ううう
5,おおお
2,くくく
0,あああ
0,えええ
0,かかか
0,ききき

というように取り出したいのです。

言葉にすると
grpを0と0以外で抽出し、その中でdataソート(0以外の中からが優先)
みたいな感じでしょうか。

二つのsqlを使えばできるでしょうが、なんとかひとつのsqlでできないでしょうか?

よろしくお願いいたします。

投稿日時 - 2014-12-03 10:07:22

QNo.8845650

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

22人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

UNIONは
取得するカラム数が同じ2つ以上のSQL文の結果を
結合するものよ

だから今回にはぴったりのはず

なのになぜ最後にorder byしちゃうの!?

1以上をorder byしたものと
0だけのをUNIONすればいいの

投稿日時 - 2014-12-03 16:22:57

補足

今、CASE WHEN を使って 自己解決しました!
・・・CASE WHEN grp>0 THEN 0 ELSE 1, data

昨日から悩んでいたので、ホッとしてます。

アドバイス、有難うございました。

投稿日時 - 2014-12-03 16:49:35

お礼

askaaska さん、ありがとうございます。

最初にそのようにしたのですが
   "union"またはその近辺で構文エラー
になったんです。

で、order by をはずしたらエラーは消えたのですが
それではまずいので
最後にorder byを追加したらエラーがでなかったもんで。^^;

いろいろありがとうございました。

投稿日時 - 2014-12-03 16:43:06

ANo.1

grp >0 と grp=0 の結果を
UNIONで結合すればいいと思うわ

投稿日時 - 2014-12-03 11:08:51

お礼

askaaskaさん、ありがとうございます。

試してみました。
unionを使ったことが無いので、 のせいかもしれませんが
思ったように取り出せませんでした。

最初のselect sqlで、where grp>0
もうひとつのselect で where grp<1 にして
union で結合、最後に order by data
にしました。

結果は
二つのselectが交じり合ったシンプルな(!)結果でした。

何か間違っていますか?
tableは同じtableだとダメですか?


最初の結果を最初に取り出してから、
二つ目のselect結果をその後に取り出したいのですが。

よろしくお願いします。

投稿日時 - 2014-12-03 13:50:21