我有一个像这样的表
STREET | NUMBERS (varchar)
broadway | 01, 03
helmet | 01, 03, 07
我想知道是否有可能获得这些数组并创建一个新表来像这样分解它们:
oid | STREET | NUMBERS
1 | broadway | 01
2 | broadway | 03
3 | helmet | 01
4 | helmet | 03
5 | helmet | 07
通过搜索,我发现array_agg()的作用恰恰相反。是否有某种反向array_agg()或任何其他方法来获得该结果?
此外,如果我还能获得另一行的位置在原始数组中具有该行的位置,那就太好了
oid | STREET | NUMBERS | POSITION
1 | broadway | 01 | 1
2 | broadway | 03 | 2
3 | helmet | 01 | 1
4 | helmet | 03 | 2
5 | helmet | 07 | 3
提前谢谢
答案 0 :(得分:2)
在横向联接中使用string_to_array()
和unnest() with ordinality
:
with my_table(street, numbers) as (
values
('broadway', '01, 03'),
('helmet', '01, 03, 07')
)
select street, number, position
from my_table
cross join unnest(string_to_array(numbers, ', ')) with ordinality as u(number, position)
street | number | position
----------+--------+----------
broadway | 01 | 1
broadway | 03 | 2
helmet | 01 | 1
helmet | 03 | 2
helmet | 07 | 3
(5 rows)