DO
$do$
BEGIN
IF EXISTS (SELECT FROM orders) THEN
DELETE FROM orders;
ELSE
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
標準SQLには手続き型要素はありません。 IF
ステートメントは、デフォルトの手続き型言語PL/pgSQLの一部です。 DO
を使用して、関数を作成するか、アドホックステートメントを実行する必要があります コマンド。
セミコロンが必要です(;
)plpgsqlの各ステートメントの最後(最後のEND
を除く) 。
END IF;
が必要です IF
の最後に ステートメント。
副選択は括弧で囲む必要があります:
IF (SELECT count(*) FROM orders) > 0 ...
または:
IF (SELECT count(*) > 0 FROM orders) ...
ただし、これは同等ではるかに高速です:
IF EXISTS (SELECT FROM orders) ...
代替
追加のSELECT
必要ありません。これは同じことをより速く行います:
DO
$do$
BEGIN
DELETE FROM orders;
IF NOT FOUND THEN
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
可能性は低いですが、同じテーブルへの同時トランザクションの書き込みが干渉する可能性があります。確実に、デモのように続行する前に、同じトランザクションでテーブルを書き込みロックします。