19

行が存在するかどうかを確認し、それに応じて行動する必要があるpostgresでストアドプロシージャを作成しています。線に沿った何か。

IF SELECT * FROM foo WHERE x = 'abc' AND y = 'xyz' THEN
  -- do something here
ELSE 
  -- do something else
END;

少しグーグルで検索しましたが、良いヒットがありませんでした。

4

2 に答える 2

29

または、さらに簡単にEXISTS

IF EXISTS (SELECT FROM foo WHERE x = 'abc' AND y = 'xyz') THEN
    ...
END IF;

見る:

于 2012-10-11T05:54:04.750 に答える
25

PERFORMFOUND自動変数を使用します:

PERFORM * FROM foo WHERE x = 'abc' AND y = 'xyz';
IF FOUND THEN
    ....
END IF;

1つ以上の行が返された場合、これは成功します。結果を正確に 1 行に制限する場合は、行数を取得するために使用GET DIAGNOSTICSするか、行の をd 変数SELECT INTOに格納してからテストします。結果が得られないことがエラーである場合は、 を使用して、正確に 1 行を取得し、ターゲット変数に格納する必要があります。count(...)DECLARESELECT INTO STRICT

このようなことを行うときは、並行性の問題に注意してください。upsert/merge 関数を作成しようとしている場合、このアプローチは機能しません「アップサートが複雑な理由」を参照してください。

于 2012-10-11T03:23:55.573 に答える