我该如何拆分这个向量?

时间:2014-10-09 17:32:13

标签: postgresql

在PostgreSql中,我有一个这样的表:

mytable
id | samples
1  | 1, 2, 3, 4, 5, 6, 7, 8

我想将这些样本拆分为三个位置的样本,得到如下结果:

id | samples
1  | 1, 2, 3
1  | 4, 5, 6
1  | 7, 8

我尝试使用不当,但结果是:

id | samples
1  | 1
1  | 2
1  | 3
1  | 4
...

你们知道我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您的架构设计 - 存储逗号分隔的整数列表 - 这使得这很难。这不是“矢量”,而是一个字符串。 Don't store lists of values as comma separated strings

您可以通过动态解析字符串来解决此问题,但性能会很糟糕。

使用样本设置:

CREATE TABLE mytable(id integer primary key, samples text);
INSERT INTO mytable(id, samples) VALUES (1, '1, 2, 3, 4, 5, 6, 7, 8');

您可以获取阵列形式:

SELECT id, string_to_array(samples, ', ')::integer[] FROM mytable;

然后将数组拆分成切片并通过以{1}开头(即第一个数组索引位置)加入generate_series,步长为3,并将结束值转换为字符串数组长度。

WITH mytable_fixed(id, samples) AS (
    SELECT id, string_to_array(samples, ', ')::integer[] FROM mytable
)
SELECT 
    id, 
    array_to_string(samples[step:step+2], ', ') 
FROM mytable_fixed, 
     LATERAL generate_series(1, array_length(samples, 1), 3) step;