この人頭いいなと思ったエピソード

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

A 回答 (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さんの発想はこれですよね。
    • good
    • 4
この回答へのお礼

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

お礼日時:2009/01/15 16:04

#5回答者です。



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

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

    • good
    • 2

No.1 です。



> ためしてみたら次のようにエラーとなってしまいました.

う、 GROUP BY 句は WHERE 句より後が正しいかも知れません。 すみません。

参考URL:http://www.postgresql.jp/document/pg815doc/html/ …
    • good
    • 0

お礼文ありがとうございます。



あ、そうですね。
WHERE id = あいでぃ
にしてるんだから当然そうなりますね(汗)

と言うことは…

SELECT
CASE
WHEN COUNT(*) > 0
THEN point
ELSE 0
END
FROM ex2
WHERE id = 5

ですね。

ってもうCOALESCEで解決されてるんですね。

久々にSQL文、見たのでなんとなく回答しちゃいました。
申し訳ありません。
    • good
    • 1
この回答へのお礼

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

お礼日時:2009/01/13 09:33

SELECT


id,
CASE
WHEN point IS NULL
THEN 0
ELSE point
END AS point
FROM てーぶる
WHERE id = あいでぃ

こんな感じでしょうか。
CASE式はSQL-92から標準のようです。


以上、ご参考になりましたら幸いです。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
ただ、試してみると

exam=# select id,case when point is null then 0
else point end as point
from ex2 where id = 10;
id | point
----+-------
(0 rows)

という具合に空行がかえってきました。なかなか厄介ですよね。

お礼日時:2009/01/12 21:40

id が UNIQUE なら、



SELECT sum(point) FROM (テーブル名) GROUP BY id WHERE id = ?

でしょうか。

該当 id が無い場合に NULL で無くゼロを返すためにはもうひと捻り必要かも知れません。

この回答への補足

すみません.zxcv0000さんの回答をヒントに試していたら次のような案が見つかりました。幸いidはuniqueなのでこれでやってみようかと思います。

exam=# select coalesce(sum(point),0) as point from ex2 where id = 5;
point
-------
0
(1 row)

お騒がせ致しました.

補足日時:2009/01/12 21:08
    • good
    • 2
この回答へのお礼

早速のお返事ありがとうございます.
ただ、ためしてみたら次のようにエラーとなってしまいました.
ちなみに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;

簡単そうで難儀な問題ということでしょうか。

お礼日時:2009/01/12 21:04

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報

このQ&Aを見た人がよく見るQ&A