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

SQL, split comma separated string values, but maintain correct order?

我正在尝试从具有存储序列信息的列的 Postgresql 数据库中提取数据,方法是对 id 值进行排序并将它们存储在逗号分隔的字符串中。 id 值在字符串中的排列顺序就是我需要获取的信息。

我有一个 table 正在存储序列信息。

id | sequence
---------------------------------------
0  | 
1  | 420598
2  | 713011,713015,713012,713014,713013
3  | 420599,420600,420601

和另一个正在存储详细信息的 table

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

这可以通过将 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;

returns:

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 不是 table 或列名的好选择,因为它也是关键字,可能会导致混淆

像这样:

select id id_a,unnest(t) id_b,generate_subscripts(t,1) "order" from (
           select id,string_to_array("sequence",',') t from yourtable
) a