2012-04-04 19 views
10

なぜPostgresから次のエラーが出るのですか?PostgreSQL IF-THEN-ELSE制御構造

syntax error at or near "IF"

私はPostgreSQL: Documentation: 8.3: Control Structuresをお読みください。まず、私は(サブクエリで)困難なクエリを実行しようとしたが、その後、私はこのような単純なものを実行しようとした:

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

エラーがまだ同じです。私は間違って何をしていますか?

答えて

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

plpgsql関数以外でPL/pgSQL文を使用することはできません。そして、この断片が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が感知していないので、無制限。

+0

ああ、あなたの返事もありがとう。いいえ、私はちょうど "IF"の条件に応じて1つまたは別の "選択"する方法を検索していた。だから、私はこのような単純な方法ではないことが分かった(IF ...(SELECT ...)= 2 THEN SELECT ... ELSE SELECT ... END IF; – Elkan

+0

実際に IF(tから選択)= 2 THEN NULL; END IF; が動作する場合、問題はおそらくコンテキストで何かをSELECTしようとしていて、何も返さないということでしょう。 この場合、パベルは完璧な例を作りました。関数を正しく定義したことを考慮して、 'RETURN QUERY'を使うことができます。 – valgog

4

anonymous blockまたはPL/pgSQL関数でPL/pgSQL制御構造を囲んでいるわけではありません。

このコントロール構造のSQL版については、CASEのドキュメントを参照してください。

+0

フム...おかげでたくさん) – Elkan

+0

CASEは、SQLクエリの一部として、しかし、トップレベルで使用することはできません。言い換えれば、すでに別のクエリの一部ではない動作を指示するのに使用することはできません。元の質問が望んでいたようです。 – BlueBomber

0

あなたはそのPL/pgSQLを囲いません。彼らはanonymous code blockで囲む必要があります。あなたのコードの例:

DO $$ BEGIN 

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

END$$; 
関連する問題