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

Postgresql 仅在特定条件下执行循环,postgresql,postgresql-9.2,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 s

如果你写这个

    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;

在字符处或附近给出错误语法错误…

您试图混合PL/PgSQL和SQL。它们其实不是一回事

选择。。。当。。。其他的结束…,正如您所写的是常规SQL。它不能嵌入PL/PgSQL语句

PL/PgSQL案例不会出现在常规的SELECT中,而只是作为一个控制结构出现。它不支持导入,因为它不是一个SELECT。这是案件的形式当。。。其他的终例

你可以写:

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案例。整个方法看起来很奇怪,但您只显示了伪代码,所以我无法真正说出您真正想要做的是什么。非常不寻常的是,您需要循环,而不仅仅是使用一些更智能的SQL,但它确实发生了


在这种情况下,我觉得您很可能能够使用联合、查询CTE和/或生成_序列来编写查询,以避免需要缓慢的PL/PgSQL循环和控制结构。

您正在尝试混合PL/PgSQL和SQL。它们其实不是一回事

选择。。。当。。。其他的结束…,正如您所写的是常规SQL。它不能嵌入PL/PgSQL语句

PL/PgSQL案例不会出现在常规的SELECT中,而只是作为一个控制结构出现。它不支持导入,因为它不是一个SELECT。这是案件的形式当。。。其他的终例

你可以写:

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案例。整个方法看起来很奇怪,但您只显示了伪代码,所以我无法真正说出您真正想要做的是什么。非常不寻常的是,您需要循环,而不仅仅是使用一些更智能的SQL,但它确实发生了


在这种情况下,我觉得您很可能能够使用联合、查询CTE和/或生成_系列来编写查询,以避免需要缓慢的PL/PgSQL循环和控制结构。

非常感谢,我没有真正做什么,我只是在学习和测试如何在具体情况下使用cycle语句。@OTARIKI啊,这更有意义。只要可以避免在PL/PgSQL中使用循环,就应该这样做。与在普通SQL中执行相同的工作相比,它的效率非常低。非常感谢,我不是在做什么,我只是在学习和测试如何在具体情况下使用cycle语句。@OTARIKI啊,这更有意义。只要可以避免在PL/PgSQL中使用循环,就应该这样做。与在普通SQL中执行相同的工作相比,它的效率非常低。