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

初歩的な質問で申し訳ありません。
テーブルAの中に、キー1が100から109までのキーを持つレコードがあるかないかを調べるSQL文を教えてください。

テーブルA
キー1 キー2
100   1
100   2
105   1
107   1
上記の場合結果は
100  有り
101  なし
102  なし
103  なし
104  なし
105  有り
106  なし
107  有り
108  なし
109  なし
と表示したいのです。
よろしくご教授ください。

A 回答 (3件)

PostgreSQLにはgenerate_seriesという関数があります。

これを使うと簡単に連続値が得られます。
後、テーブルAの件数が少ないか、キー1に索引があれば
select a,
case when exists ( select 1 from テーブルA
where テーブルA.キー1 = s.a )
then '有り' else '無し' end
from generate_series( 100, 109 ) as s(a);

も検討してみてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

generate_series関数を使ってみます。
簡単そうでテーブル件数が増えても対応できるで便利ですね。

お礼日時:2011/11/21 18:49

PostgreSQL8.2以降なら複数行VALUES句が使えますので、VALUESで100~109の定数テーブルを作る方法も有りますね。



例) --------------------------------------------
SELECT
キー1,
CASE WHEN COUNT(テーブルA.キー1) > 0 THEN '有り' ELSE 'なし' END
FROM
(VALUES(100), (101), (102), (103), (104), (105), (106), (107), (108), (109)) AS num (キー1)
LEFT OUTER JOIN テーブルA USING (キー1)
GROUP BY キー1
ORDER BY キー1;
------------------------------------------------
    • good
    • 0
この回答へのお礼

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

お礼が遅くなり申し訳ありません。

分かりやすいのですが、定数テーブルの数が増えると
厄介ですね。

お礼日時:2011/11/21 18:46

SELECT DISTINCT T1.キー1


,CASE WHEN T2.キー1 IS NULL THEN 'なし' ELSE '有り' END
FROM (SELECT 100 AS キー1
UNION ALL SELECT 101 AS キー1
UNION ALL SELECT 102 AS キー1
UNION ALL SELECT 103 AS キー1
UNION ALL SELECT 104 AS キー1
UNION ALL SELECT 105 AS キー1
UNION ALL SELECT 106 AS キー1
UNION ALL SELECT 107 AS キー1
UNION ALL SELECT 108 AS キー1
UNION ALL SELECT 109 AS キー1)AS T1
LEFT JOIN テーブルA T2
ON T1.キー1=T2.キー1 ORDER BY 1
ではどうでしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼が遅くなり申し訳ありません。

シンプルで分かりやすいのですが、
検索件数が増えるとコーディングが長くなるのが難点ですね。

お礼日時:2011/11/21 18:43

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