• ベストアンサー

テーブルからのselectにおいてデータの有無により結果をわけたい

id | point ----+------- 1 | 10 2 | 9 3 | 5 .... というテーブルがあるとします. idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです. plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか? よろしくお願い致します。

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

  • ベストアンサー
  • baunce
  • ベストアンサー率66% (2/3)
回答No.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さんの発想はこれですよね。

yasumitu
質問者

お礼

おおっ、これはすごい。勉強になります。 chukenkenkouさんの発想からSQL文をつくることが自分にはできなかったのでとても助かりました。 ありがとうございました。

その他の回答 (6)

回答No.6

#5回答者です。 #5回答は、やりたいことを私の方で勘違いしていました。 失礼しました。

回答No.5

「存在しない」ものを検索したいなら、予め別表で用意しておくか、selectで一時的に作り、unionするしかありません。

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.4

No.1 です。 > ためしてみたら次のようにエラーとなってしまいました. う、 GROUP BY 句は WHERE 句より後が正しいかも知れません。 すみません。

参考URL:
http://www.postgresql.jp/document/pg815doc/html/sql-select.html
  • rinmane
  • ベストアンサー率56% (64/113)
回答No.3

お礼文ありがとうございます。 あ、そうですね。 WHERE id = あいでぃ にしてるんだから当然そうなりますね(汗) と言うことは… SELECT CASE WHEN COUNT(*) > 0 THEN point ELSE 0 END FROM ex2 WHERE id = 5 ですね。 ってもうCOALESCEで解決されてるんですね。 久々にSQL文、見たのでなんとなく回答しちゃいました。 申し訳ありません。

yasumitu
質問者

お礼

再度ありがとうございます。 なるほど、こんな書き方もできるのですね。勉強になりました。 ちなみに下のようにsum(point)として目的の結果を得ました。 SELECT CASE WHEN COUNT(*) > 0 THEN sum(point) ELSE 0 END FROM ex2 WHERE id = 5; ありがとうございました。

  • rinmane
  • ベストアンサー率56% (64/113)
回答No.2

SELECT id, CASE WHEN point IS NULL THEN 0 ELSE point END AS point FROM てーぶる WHERE id = あいでぃ こんな感じでしょうか。 CASE式はSQL-92から標準のようです。 以上、ご参考になりましたら幸いです。

yasumitu
質問者

お礼

ご回答ありがとうございます。 ただ、試してみると 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)
回答No.1

id が UNIQUE なら、 SELECT sum(point) FROM (テーブル名) GROUP BY id WHERE id = ? でしょうか。 該当 id が無い場合に NULL で無くゼロを返すためにはもうひと捻り必要かも知れません。

yasumitu
質問者

お礼

早速のお返事ありがとうございます. ただ、ためしてみたら次のようにエラーとなってしまいました. ちなみに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; 簡単そうで難儀な問題ということでしょうか。

yasumitu
質問者

補足

すみません.zxcv0000さんの回答をヒントに試していたら次のような案が見つかりました。幸いidはuniqueなのでこれでやってみようかと思います。 exam=# select coalesce(sum(point),0) as point from ex2 where id = 5; point ------- 0 (1 row) お騒がせ致しました.

関連するQ&A