我试图通过排序id值并将它们存储在逗号分隔的字符串中,从具有一列存储序列信息的Postgresql数据库中提取数据。 id值在字符串中列出的顺序是我需要获取的信息。
我有一个存储序列信息的表。
id | sequence
---------------------------------------
0 |
1 | 420598
2 | 713011,713015,713012,713014,713013
3 | 420599,420600,420601
和另一个存储详细信息的表
id | details
-----------------
420598 | ' /$$$$$$ /$$$$$$ /$$'
420599 | '| $$$$$$/| $$$$$$/| $$$$$$$$'
420600 | ' \______/ \____ $$$|________/'
420601 | ' \__/ '
713011 | ' /$$__ $$ /$$__ $$| $$'
713012 | '| $$$$$$ | $$ | $$| $$'
713013 | ' /$$ \ $$| $$/$$ $$| $$'
713014 | ' \____ $$| $$ | $$| $$'
713015 | '| $$ \__/| $$ \ $$| $$'
我需要弄清楚如何获得以下信息。
id_a | id_b | order
---------------------
0 | |
1 | 420598 | 0
2 | 713011 | 0
2 | 713015 | 1
2 | 713012 | 2
2 | 713014 | 3
2 | 713013 | 4
3 | 420599 | 0
3 | 420600 | 1
3 | 420601 | 2
我可以找到如何轻松地将逗号分隔的字符串转换为行,但是我还需要提取序列信息。对值在字符串中的位置进行排序。有人可以建议这样做的方法吗?
答案 0 :(得分:1)
像这样:
select id id_a,unnest(t) id_b,generate_subscripts(t,1) "order" from (
select id,string_to_array("sequence",',') t from yourtable
) a
答案 1 :(得分:0)
通过将CSV字符串转换为数组然后使用with ordinality
选项取消嵌套即可轻松完成:
select id, t.seq, t.idx
from sequence
left join lateral unnest(string_to_array(sequence, ',')) with ordinality as t(seq,idx) on true
order by id, t.idx;
返回:
id | seq | idx
---+--------+----
0 | |
1 | 420598 | 1
2 | 713011 | 1
2 | 713015 | 2
2 | 713012 | 3
2 | 713014 | 4
2 | 713013 | 5
3 | 420599 | 1
3 | 420600 | 2
3 | 420601 | 3
sequence
对于表或列名不是一个好的选择,因为它也是一个关键字,并且可能导致混乱