web-dev-qa-db-ja.com

行が存在するかどうかを確認するPL / pgSQL

PL/pgSQLで関数を作成しており、行が存在するかどうかを確認する最も簡単な方法を探しています。
今、私はintegerbooleanに選択していますが、実際には機能しません。これを行う最良の方法を知るには、PL/pgSQLの経験がまだありません。

私の機能の一部は次のとおりです。

DECLARE person_exists boolean;
BEGIN

person_exists := FALSE;

SELECT "person_id" INTO person_exists
  FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;

IF person_exists THEN
  -- Do something
END IF;

END; $$ LANGUAGE plpgsql;

更新-今のところこのようなことをしています:

DECLARE person_exists integer;
BEGIN

person_exists := 0;

SELECT count("person_id") INTO person_exists
  FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;

IF person_exists < 1 THEN
  -- Do something
END IF;
39
nnyby

よりシンプルで、短い、faster:EXISTS .

_IF EXISTS (SELECT 1 FROM people p WHERE p.person_id = my_person_id) THEN
  -- do something
END IF;
_

クエリプランナーは、count()とは対照的に、見つかった最初の行で停止できます。大きなテーブルで違いを生みます。一意の列の条件ではほとんど問題になりません-とにかく1行だけが対象となります(そして、すぐに検索するためのインデックスがあります)。

以下のコメントの @ a_horse_with_no_name からの入力により改善されました。

空のSELECTリストを使用することもできます。

_IF EXISTS (SELECT FROM people p WHERE p.person_id = my_person_id) THEN ...
_

SELECTリストはEXISTSの結果には関係ないためです。少なくとも1つの条件を満たす行の存在のみが重要です。

116

Count(*)を使用します

declare 
   cnt integer;
begin
  SELECT count(*) INTO cnt
  FROM people
  WHERE person_id = my_person_id;

IF cnt > 0 THEN
  -- Do something
END IF;

編集(声明を読まなかったダウンボッターおよび同様のことをしている可能性のある他の人)

解決策は、onlyのみです。列にwhere句があるためです(列の名前から、その主キーが示唆されているため、where句非常に効果的です)

そのwhere句のため、主キーによって識別される行の存在をテストするためにLIMITなどを使用する必要はありません。それisこれをテストする効果的な方法。