仅在特定条件下执行CASE执行循环

时间:2013-05-20 10:34:54

标签: postgresql postgresql-9.2

如果写这个

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

只有在WHEN some_variable >= 3

的情况下才可以执行LOOP语句

我在尝试:

        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 ...

1 个答案:

答案 0 :(得分:4)

你正试图混合PL / PgSQL和SQL。他们并不是真的一样。

SELECT ... CASE WHEN ... ELSE ... END ...,就像你写的那样是普通的SQL。它无法嵌入PL / PgSQL语句。

PL / PgSQL CASE不会出现在常规SELECT中,只是作为一种控制结构。它不支持INTO,因为它不是SELECT。它的格式为CASE WHEN ... ELSE ... END CASE;

请参阅PL/PgSQL control structures

你可以写:

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,这是非常不寻常的,但它确实发生了。

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