Postgres でこのようなクエリを実行するにはどうすればよいでしょうか?
IF (select count(*) from orders) > 0
THEN
DELETE from orders
ELSE
INSERT INTO orders values (1,2,3);
ベストアンサー1
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$
可能性は低いですが、同じテーブルに書き込む同時トランザクションが干渉する可能性があります。確実にするために、書き込みロック示されているように続行する前に、同じトランザクション内のテーブルを実行します。