PostgreSQL IF文 質問する

PostgreSQL IF文 質問する

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$

可能性は低いですが、同じテーブルに書き込む同時トランザクションが干渉する可能性があります。確実にするために、書き込みロック示されているように続行する前に、同じトランザクション内のテーブルを実行します。

おすすめ記事