- ベストアンサー
テーブルからのselectにおいてデータの有無により結果をわけたい
id | point ----+------- 1 | 10 2 | 9 3 | 5 .... というテーブルがあるとします. idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです. plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか? よろしくお願い致します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。 select dm.id,case when ex1.point is null then 0 else ex1.point end from (select ? as id) as dm left join ex1 on dm.id = ex1.id; ?を適当に変えてください。 chukenkenkouさんの発想はこれですよね。
その他の回答 (6)
- chukenkenkou
- ベストアンサー率43% (833/1926)
#5回答者です。 #5回答は、やりたいことを私の方で勘違いしていました。 失礼しました。
- chukenkenkou
- ベストアンサー率43% (833/1926)
「存在しない」ものを検索したいなら、予め別表で用意しておくか、selectで一時的に作り、unionするしかありません。
- zxcv0000
- ベストアンサー率56% (111/196)
No.1 です。 > ためしてみたら次のようにエラーとなってしまいました. う、 GROUP BY 句は WHERE 句より後が正しいかも知れません。 すみません。
- rinmane
- ベストアンサー率56% (64/113)
お礼文ありがとうございます。 あ、そうですね。 WHERE id = あいでぃ にしてるんだから当然そうなりますね(汗) と言うことは… SELECT CASE WHEN COUNT(*) > 0 THEN point ELSE 0 END FROM ex2 WHERE id = 5 ですね。 ってもうCOALESCEで解決されてるんですね。 久々にSQL文、見たのでなんとなく回答しちゃいました。 申し訳ありません。
お礼
再度ありがとうございます。 なるほど、こんな書き方もできるのですね。勉強になりました。 ちなみに下のようにsum(point)として目的の結果を得ました。 SELECT CASE WHEN COUNT(*) > 0 THEN sum(point) ELSE 0 END FROM ex2 WHERE id = 5; ありがとうございました。
- rinmane
- ベストアンサー率56% (64/113)
SELECT id, CASE WHEN point IS NULL THEN 0 ELSE point END AS point FROM てーぶる WHERE id = あいでぃ こんな感じでしょうか。 CASE式はSQL-92から標準のようです。 以上、ご参考になりましたら幸いです。
お礼
ご回答ありがとうございます。 ただ、試してみると exam=# select id,case when point is null then 0 else point end as point from ex2 where id = 10; id | point ----+------- (0 rows) という具合に空行がかえってきました。なかなか厄介ですよね。
- zxcv0000
- ベストアンサー率56% (111/196)
id が UNIQUE なら、 SELECT sum(point) FROM (テーブル名) GROUP BY id WHERE id = ? でしょうか。 該当 id が無い場合に NULL で無くゼロを返すためにはもうひと捻り必要かも知れません。
お礼
早速のお返事ありがとうございます. ただ、ためしてみたら次のようにエラーとなってしまいました. ちなみにpostgreSQL 8.3 です。 exam=# select sum(point) from ex2 group by id where id = 1; ERROR: syntax error at or near "where" LINE 1: select sum(point) from ex2 group by id where id = 1; 簡単そうで難儀な問題ということでしょうか。
補足
すみません.zxcv0000さんの回答をヒントに試していたら次のような案が見つかりました。幸いidはuniqueなのでこれでやってみようかと思います。 exam=# select coalesce(sum(point),0) as point from ex2 where id = 5; point ------- 0 (1 row) お騒がせ致しました.
お礼
おおっ、これはすごい。勉強になります。 chukenkenkouさんの発想からSQL文をつくることが自分にはできなかったのでとても助かりました。 ありがとうございました。