PL/pgSQLで関数を書いていますが、行が存在するかどうかを調べる最も簡単な方法を探しています。
今はinteger
をboolean
に選択していますが、これは実際には機能しません。私はこれを行う最良の方法を知るのにまだ十分なPL/pgSQLを経験していません。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;
良い点! (person_idはおそらくプライマリキーなので、インデックスルックアップを使用して単一のテーブルを "スキャン"するだけです)。 –
@a_horse_with_no_name:現在(PostgreSQL 9.1) 'count()' *は常に逐次スキャンをトリガします。テーブルで 'EXPLAIN ANALYZE SELECT count(id)from tbl'を試してみてください。 [Postgres Wikiの遅いカウント]に関する詳細(http://wiki.postgresql.org/wiki/Slow_Counting) Postgres 9.2の新しいインデックスのみのスキャンは、(いくつかの条件を指定して) 'count(id)'のインデックススキャンを利用することができるため、改善することになっていますが、まだ試してみる必要があります。 –
A条件付きの 'count(*)' * *(特にPK列にない)は、逐次スキャンを開始しません**。 –