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 语句,对吗?

只有在 if 的情况下才可以执行 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中,只是作为一个控制结构出现。它不支持INTO,因为它不是SELECT. 它的形式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/PgSQL CASE。整个方法看起来很奇怪,但你只显示虚拟代码,所以我不能真正说出你真正想要做什么。你需要LOOP而不是仅仅使用一些更智能的 SQL 是很不寻常的,但它确实发生了。

在这种情况下,我很可能会发现您能够使用unions、with查询 (CTE) 编写查询,和/或generate_series避免需要缓慢的 PL/PgSQL 循环和控制结构。

于 2013-05-20T11:32:52.933 回答