SQL,以逗号分隔字符串值,但保持正确的顺序?

时间:2018-08-23 06:28:02

标签: postgresql split comma

我试图通过排序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

我可以找到如何轻松地将逗号分隔的字符串转换为行,但是我还需要提取序列信息。对值在字符串中的位置进行排序。有人可以建议这样做的方法吗?

http://sqlfiddle.com/#!17/ff5f4

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对于表或列名不是一个好的选择,因为它也是一个关键字,并且可能导致混乱