如果写这个
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
?
我在尝试:
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 ...
答案 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,这是非常不寻常的,但它确实发生了。
在这种情况下,我很可能会发现您可以使用union
,with
查询(CTE)和/或generate_series
来编写查询避免需要缓慢的PL / PgSQL循环和控制结构。