有没有办法在PostgreSQL的每N个字符后面分割字符串?我想regexp_split_to_array可以用来做这个:

select unnest(regexp_split_to_array('abcdefgh', E'...regexp here...'));

示例输入:abcdefgh
所需输出(每2个字符后拆分):
ab
cd
ef
gh

所需输出(每3个字符后拆分):
abc
def
gh

什么regexp会这样做?还有别的办法吗?

最佳答案

使用substringgenerate_series

regress=> select substring('abcdefgh' from n for 2) from generate_series(1, length( 'abcdefgh' ), 2) n;
 substring
-----------
 ab
 cd
 ef
 gh
(4 rows)

regress=> select substring('abcdefgh' from n for 3) from generate_series(1, length( 'abcdefgh' ), 3) n;
 substring
-----------
 abc
 def
 gh
(3 rows)

这很容易被包装成一个可内联的SQL函数:
CREATE OR REPLACE FUNCTION string_nchars(text, integer) RETURNS setof text AS $$
SELECT substring($1 from n for $2) FROM generate_series(1, length($1), $2) n;
$$ LANGUAGE sql IMMUTABLE;

用法:
regress=> SELECT string_nchars('abcdefgh',3);
 string_nchars
---------------
 abc
 def
 gh
(3 rows)

07-24 21:15