94

Postgresでそのようなクエリを実行するにはどうすればよいですか?

IF (select count(*) from orders) > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
4

4 に答える 4

172
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$

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

于 2012-07-02T19:28:42.140 に答える
52

私のように誰かがこの質問に出くわした場合に役立つように、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
于 2016-05-27T07:01:46.277 に答える
9

PL /pgSQLCASEの基本構造を匿名コードブロックプロシージャブロックで使用することもできます。

DO $$ BEGIN
    CASE
        WHEN boolean-expression THEN
          statements;
        WHEN boolean-expression THEN
          statements;
        ...
        ELSE
          statements;
    END CASE;
END $$;

参照:

  1. http://www.postgresql.org/docs/current/static/sql-do.html
  2. https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html
于 2016-11-28T21:28:28.900 に答える
8

ドキュメントから

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;

于 2012-07-02T18:23:09.223 に答える