如何有效地垂直连接多列

时间:2019-08-01 01:45:41

标签: sql postgresql

对于最终目标,我想创建一个看起来像这样的表:

Table 1
option_ID person_ID option
1         1         B
2         1         
3         2         C
4         2         A
5         3         A
6         3         B

这个想法是,一个人最多可以从3个选项中选择2个(在这种情况下,一个人只能选择1个选项)。但是,当我的原始数据格式将3个选项放在一列中时,即:

Table 2
person_ID option
1         B
2         C,A
3         A,B

我通常要做的是在Excel中使用','分隔符来使用'Text to Columns'功能,并手动垂直连接两列。但是,我发现当面对更多选择(例如10甚至20)时,此方法变得不切实际。有没有一种方法可以使用postgresql或其他一些方法从Table 2Table 1

2 个答案:

答案 0 :(得分:0)

您可以使用regexp_split_to_table()

select row_number() over () as id,
       t.person_id, v.option
from t cross join lateral
     regexp_split_to_table(t.option, ',') option
order by person_id, option;

Here是db <>小提琴。

实际上,如果您要每个人身分正好两行:

select row_number() over () as id, t.person_id, v.option
from t cross join lateral
     (values (1, split_part(t.option, ',', 1)), (2, split_part(t.option, ',', 2))) v(pos, option)
order by person_id, pos;

答案 1 :(得分:0)

使用string_agg()函数。

select person_ID, string_agg(option, ',') as option 
from table1
group by person_ID