[英]PostgreSQL order in recursive query
我尝试以自然顺序获取查询结果,但失败了。
create table Tab2 (id int, F1 varchar(100));
insert into Tab2 values(1, '10,56,657,34,767,71');
insert into Tab2 values(3, '1,5487,27,9');
insert into Tab2 values(4, '11,13,37,2');
insert into Tab2 values(2, '12,6,65,8,67,22,70,5');
WITH RECURSIVE etc (id, DataItem, F1) AS (
(SELECT id,
LEFT(F1, strpos(concat(F1, ','), ',')-1) AS Part,
overlay(F1 placing '' from 1 for strpos(concat(F1, ','),',')) AS Remainder
FROM Tab2
--ORDER BY Remainder
)
UNION ALL
(SELECT id,
LEFT(F1, strpos(concat(F1, ','), ',')-1),
overlay(F1 placing '' from 1 for strpos(concat(F1, ','),','))
FROM etc e
WHERE F1 > ''
--ORDER BY Dataitem
)
)
SELECT id, row_number() over(partition BY id ORDER BY id) num, DataItem from etc ORDER BY id;
http://sqlfiddle.com/#!15/b0ccc6/89/0
我的错误在哪里?
如果我正确理解您的查询,您正在尝试从(设计不良的)逗号分隔字符串中获取所有元素。 无需为此使用递归查询。
您可以将字符串转换为数组,然后可以将其“未嵌套”成行。 使用with ordinality
的选项还将返回数组中每个元素的索引,该索引可以按order by
使用,以保留字符串中项目的原始顺序。
select t2.id, i.num, i.dataitem
from tab2 t2
cross join unnest(string_to_array(f1,',')) with ordinality as i(dataitem, num)
order by t2.id, i.num;
假设您想按顺序获取DataItem
,其中它放置在逗号分隔的字符串中,您可以使用另一个字段来获取“索引”(在下面的示例中它是rowno
)。
例如:
id, dataitem
1, 10
1, 56
1, 657
...
1, 71
2, 12
...
2, 5
etc.
看:
WITH RECURSIVE etc (id, rowno, DataItem, F1) AS (
(SELECT id, 1 as rowno,
LEFT(F1, strpos(concat(F1, ','), ',')-1) AS Part,
overlay(F1 placing '' from 1 for strpos(concat(F1, ','),',')) AS Remainder
FROM Tab2
)
UNION ALL
(SELECT id, rowno +1 as rowno,
LEFT(F1, strpos(concat(F1, ','), ',')-1),
overlay(F1 placing '' from 1 for strpos(concat(F1, ','),','))
FROM etc e
WHERE F1 > ''
)
)
SELECT id, DataItem
from etc
ORDER BY id, RowNo;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.