如何用变量调用 substring()?

How to call substring() with variables?

如何使用 startcount 参数的变量调用 substring() 函数?下面的示例代码不起作用。

DO
$$
 declare
    v_idx numeric(3);
    v_ch char(1);
    v_string varchar(50);
 begin
     v_idx := 1;
     v_string := 'My String';
      WHILE v_idx < LENGTH(v_string)
     LOOP
        v_ch := substring(v_string, v_idx, 1);  -- here!
        raise notice 'Value: %', v_ch;
        v_idx := v_idx + 1;
     END LOOP;
end;
$$;

这个有效:

DO
$$
DECLARE
   _string text := 'My String';
   _start  int := 1;            -- integer!
   _count  int := 1;            -- integer!
   _substr text;
BEGIN
   FOR _start IN 1 .. length(_string)
   LOOP
      _substr := substring(_string, _start, _count);
      RAISE NOTICE 'Substring from % for %: %', _start, _count, _substr;
   END LOOP;
END
$$;

生产:

NOTICE:  Substring from 1 for 1: M
NOTICE:  Substring from 2 for 1: y
NOTICE:  Substring from 3 for 1:  
NOTICE:  Substring from 4 for 1: S
NOTICE:  Substring from 5 for 1: t
NOTICE:  Substring from 6 for 1: r
NOTICE:  Substring from 7 for 1: i
NOTICE:  Substring from 8 for 1: n
NOTICE:  Substring from 9 for 1: g

主要是因为 substring() 期望 integer 输入 startcount(不是 numeric)。
在你的循环中还有一个 off-by-1 错误,我用一个更简单、更便宜、正确的 FOR 循环替换了它。

您可以在声明时初始化变量。

顺便说一句,substring() 的文档化标准 SQL 语法是:

substring(_string FROM _start FOR _count)

但是仅使用逗号的 Postgres 实现也可以。