1. ホーム
  2. sql

[解決済み] PostgreSQLのIF文

2022-03-06 22:57:20

質問

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 の各ステートメントの最後に追加してください ( ただし、最後の 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$

可能性は低いですが、同じテーブルに書き込む同時実行トランザクションが干渉する可能性があります。確実にするために ライトロック を同じトランザクションで実行してから、デモのように進めてください。