- ベストアンサー
レコードの有無をすばやく検索するSQL文
初歩的な質問で申し訳ありません。 テーブル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 なし と表示したいのです。 よろしくご教授ください。
- みんなの回答 (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); も検討してみてください。
その他の回答 (2)
- root139
- ベストアンサー率60% (488/809)
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; ------------------------------------------------
お礼
ご回答ありがとうございました。 お礼が遅くなり申し訳ありません。 分かりやすいのですが、定数テーブルの数が増えると 厄介ですね。
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
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 ではどうでしょうか。
お礼
ご回答ありがとうございます。 お礼が遅くなり申し訳ありません。 シンプルで分かりやすいのですが、 検索件数が増えるとコーディングが長くなるのが難点ですね。
お礼
ご回答ありがとうございます。 generate_series関数を使ってみます。 簡単そうでテーブル件数が増えても対応できるで便利ですね。