• ベストアンサー

レコードの有無をすばやく検索する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  なし と表示したいのです。 よろしくご教授ください。

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.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); も検討してみてください。

Horirin39
質問者

お礼

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

その他の回答 (2)

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

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; ------------------------------------------------

Horirin39
質問者

お礼

ご回答ありがとうございました。 お礼が遅くなり申し訳ありません。 分かりやすいのですが、定数テーブルの数が増えると 厄介ですね。

回答No.1

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 ではどうでしょうか。

Horirin39
質問者

お礼

ご回答ありがとうございます。 お礼が遅くなり申し訳ありません。 シンプルで分かりやすいのですが、 検索件数が増えるとコーディングが長くなるのが難点ですね。

関連するQ&A