有没有办法在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会这样做?还有别的办法吗?
最佳答案
使用substring
和generate_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)