Postgresでそのようなクエリを実行するにはどうすればよいですか?
IF (select count(*) from orders) > 0
THEN
DELETE from orders
ELSE
INSERT INTO orders values (1,2,3);
Postgresでそのようなクエリを実行するにはどうすればよいですか?
IF (select count(*) from orders) > 0
THEN
DELETE from orders
ELSE
INSERT INTO orders values (1,2,3);
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の各ステートメントの最後にセミコロン()が必要です( finalを除く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$
可能性は低いですが、同じテーブルへの同時トランザクションの書き込みが干渉する可能性があります。確実に、図のように続行する前に、同じトランザクションでテーブルを書き込みロックします。
私のように誰かがこの質問に出くわした場合に役立つように、PostgreSQLで使用する場合は、「CASE」を使用します。
select
case
when stage = 1 then 'running'
when stage = 2 then 'done'
when stage = 3 then 'stopped'
else
'not running'
end as run_status from processes
PL /pgSQLCASEの基本構造を匿名コードブロックプロシージャブロックで使用することもできます。
DO $$ BEGIN
CASE
WHEN boolean-expression THEN
statements;
WHEN boolean-expression THEN
statements;
...
ELSE
statements;
END CASE;
END $$;
参照:
ドキュメントから
IF boolean-expression THEN
statements
ELSE
statements
END IF;
したがって、上記の例では、コードは次のようになります。
IF select count(*) from orders > 0
THEN
DELETE from orders
ELSE
INSERT INTO orders values (1,2,3);
END IF;
あなたは行方不明でした:END IF;