web-dev-qa-db-ja.com

PostgreSQL IF-THEN-ELSE制御構造

Postgresから常に次のエラーが発生するのはなぜですか?

syntax error at or near "IF"

私は PostgreSQL:ドキュメント:8.3:制御構造 を読みました。最初に(サブクエリを使用して)難しいクエリを実行しようとしましたが、次のような単純なクエリを実行しようとしました。

IF 2 <> 0 THEN select * from users; END IF;

エラーはまだ同じです。何が悪いのですか?

10
Elkan
IF 2 <> 0 THEN select * from users; END IF;

PL/pgSQLステートメントをplpgsql関数の外で使用することはできません。そして、このフラグメントがplpgsql関数からのものである場合、それもナンセンスです。 T-SQLのようにクエリの結果を直接返すことはできません。

CREATE OR REPLACE FUNCTION test(p int)
RETURNS SETOF users AS $$
BEGIN
  IF p = 1 THEN
    RETURN QUERY SELECT * FROM users;
  END IF;
  RETURN;
END;
$$ LANGUAGE plpgsql;

関数から何らかの結果が得られる場合は、RETURNステートメントを使用する必要があります-plpgsqlは関数のみを認識し、プロシージャをサポートしていません-したがって、無制限のSELECTは意味がありません。

18
Pavel Stehule

そのPL/pgSQL制御構造を anonymous block またはPL/pgSQL関数で囲んでいません。

この制御構造のSQLバージョンについては、ドキュメントの CASE を参照してください。

5
Milen A. Radev

そのPL/pgSQLを囲んでいません。 匿名コードブロック で囲む必要があります。あなたのコードの例:

DO $$ BEGIN

    IF 2 <> 0 THEN select * from users; END IF;

END$$;
1
user