如何用变量调用 substring()?
How to call substring() with variables?
如何使用 start
和 count
参数的变量调用 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
输入 start
和 count
(不是 numeric
)。
在你的循环中还有一个 off-by-1 错误,我用一个更简单、更便宜、正确的 FOR
循环替换了它。
您可以在声明时初始化变量。
顺便说一句,substring()
的文档化标准 SQL 语法是:
substring(_string FROM _start FOR _count)
但是仅使用逗号的 Postgres 实现也可以。
如何使用 start
和 count
参数的变量调用 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
输入 start
和 count
(不是 numeric
)。
在你的循环中还有一个 off-by-1 错误,我用一个更简单、更便宜、正确的 FOR
循环替换了它。
您可以在声明时初始化变量。
顺便说一句,substring()
的文档化标准 SQL 语法是:
substring(_string FROM _start FOR _count)
但是仅使用逗号的 Postgres 实现也可以。