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
我可以轻松找到如何将逗号分隔的字符串转换为行,但我还需要提取序列信息。当它们在字符串中的位置时,值的顺序。任何人都可以建议这样做的方法吗?
这可以通过将 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
我正在尝试从具有存储序列信息的列的 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
我可以轻松找到如何将逗号分隔的字符串转换为行,但我还需要提取序列信息。当它们在字符串中的位置时,值的顺序。任何人都可以建议这样做的方法吗?
这可以通过将 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