PL/pgSQLで関数を作成しており、行が存在するかどうかを確認する最も簡単な方法を探しています。
今、私はinteger
をboolean
に選択していますが、実際には機能しません。これを行う最良の方法を知るには、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;
よりシンプルで、短い、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つの条件を満たす行の存在のみが重要です。
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これをテストする効果的な方法。