反向 for 循环在 Postgresql 中不起作用

问题描述 投票:0回答:3

当我尝试在 PostgreSQL 中使用 Reverse for 循环时,编译器似乎无法识别单词“reverse”。 它完全跳过循环。

DO $$
BEGIN
RAISE NOTICE 'LOOP STARTING......' ;
FOR  I IN  REVERSE  1..10 LOOP
RAISE NOTICE 'INSIDE LOOP......' ;
RAISE NOTICE 'NUMBER IS  %', I;
END LOOP;
END $$ ;

输出
-------------------
注意:循环开始......

但是当我省略“reverse”这个词时,编译器工作正常。 知道为什么会发生这种情况吗?

我使用的是 PgAdmin 版本 1.20.0

postgresql for-loop reverse pgadmin
3个回答
8
投票

如果您选择

REVERSE
,您也必须将
10
1
逆转。所以你必须更换:

FOR  I IN  REVERSE  1..10 LOOP

FOR  I IN  REVERSE  10..1 LOOP

0
投票

医生说如下:

如果下限大于上限(或小于,在 REVERSE 情况下),则根本不执行循环体。没有出现错误。

所以,下面这两个有效:

DO $$
BEGIN
  FOR num IN 1..3 LOOP
    RAISE INFO '%', num;
  END LOOP;
END
$$;
DO $$
BEGIN
  FOR num IN REVERSE 3..1 LOOP
    RAISE INFO '%', num;
  END LOOP;
END
$$;

但是,下面这两个不起作用:

DO $$
BEGIN
  FOR num IN 3..1 LOOP
    RAISE INFO '%', num;
  END LOOP;
END
$$;
DO $$
BEGIN
  FOR num IN REVERSE 1..3 LOOP
    RAISE INFO '%', num;
  END LOOP;
END
$$;

-1
投票

谢谢大家的帮助。

我还面临一个问题。

根据您的建议,我已经整理出了我的反向 for 循环概念..

我正在尝试在 PgAdmin 中使用反向循环来反转数字“1234”。

DO $$
DECLARE
L_NO VARCHAR(5) := '1234';
L_LEN NUMERIC(5);
L_REV_NO VARCHAR(5);
BEGIN
L_LEN := CHAR_LENGTH(L_NO) ;
RAISE NOTICE 'STRING LENGTH IS %' , L_LEN  ;
FOR  CNTR IN  REVERSE  L_LEN..1 LOOP
   L_REV_NO = L_REV_NO||SUBSTRING(L_NO,CNTR,1);
END LOOP;
RAISE NOTICE 'NUMBER IS %' ,L_NO ;
RAISE NOTICE 'REVERSE NUMBER IS %' ,L_REV_NO ;
END $$ ;

输出

NOTICE:  STRING LENGTH IS 4
NOTICE:  NUMBER IS 1234
NOTICE:  REVERSE NUMBER IS <NULL>

为什么相反的数字是

<Null>
。 即使我检查了 SUBSTRING func Synatx 它是否正确?

© www.soinside.com 2019 - 2024. All rights reserved.