1

これを書けば

    DECLARE res INTEGER;
    DECLARE loop_res INTEGER;


    BEGIN
        SELECT 0 INTO loop_res;



        FOR i IN 1..5 LOOP
            SELECT loop_res + i INTO loop_res;
        END LOOP;


        SELECT 
        case
            WHEN some_variable < 3   
                THEN  --some result
            WHEN some_variable  >= 3
                THEN  loop_res
        END
        INTO res;

これは機能しますが、ここではとにかく LOOP ステートメントを実行しますよね?

場合にのみ、LOOP ステートメントを実行することが可能WHEN some_variable >= 3です。

やっています :

        SELECT 
        case
            WHEN some_variable  < 3   
                THEN   --some result
            WHEN some_variable   >= 3
                THEN  
                    FOR i IN 1..5 LOOP
                        SELECT loop_res + i INTO loop_res;
                    END LOOP;
                    loop_res
        END
        INTO res;

エラーを与えるsyntax error at or near "FOR" at character ...

4

1 に答える 1

4

PL/PgSQL と SQL を混在させようとしています。それらは実際には同じものではありません。

SELECT ... CASE WHEN ... ELSE ... END ...、あなたが書いたように、通常のSQLです。PL/PgSQL ステートメントを埋め込むことはできません。

PL/PgSQLCASEは、通常のには表示されずSELECT、制御構造として単独で表示されます。ではないので対応していませINTOSELECT。という形ですCASE WHEN ... ELSE ... END CASE;

PL/PgSQL 制御構造を参照してください。

あなたは書くことができます:

CASE
    WHEN some_variable < 3 THEN 
        res := 0;
    WHEN some_variable >= 3 THEN  
        FOR i IN 1..5 LOOP
            loop_res := loop_res + i;
        END LOOP;
        res := loop_res;
END CASE;

これは PL/PgSQLCASEです。全体のアプローチは奇妙に見えますが、ダミーのコードしか表示されていないため、実際に何をしようとしているのかはわかりません。LOOPよりスマートな SQL を使用するだけでなく、それが必要になることは非常にまれですが、実際に発生します。

unionこの場合、s やwithクエリ (CTE)を使用してクエリを記述したりgenerate_series、遅い PL/PgSQL ループや制御構造の必要性を回避したりできるようになる可能性が高いと思います。

于 2013-05-20T11:32:52.933 に答える