Postgresql 用于在Postgres中对子元素进行动态排序的查询
我有一个如下所示的数据集(PostgresQL版本11),我想在其中添加一个带有小数点的排序列,以便在可视化中轻松映射父-子树 任何方法或查询,我们都可以做到这一点,尝试行数和排名,但这是没有帮助的 数据集:Postgresql 用于在Postgres中对子元素进行动态排序的查询,postgresql,Postgresql,我有一个如下所示的数据集(PostgresQL版本11),我想在其中添加一个带有小数点的排序列,以便在可视化中轻松映射父-子树 任何方法或查询,我们都可以做到这一点,尝试行数和排名,但这是没有帮助的 数据集: Parent Child Vitamine Vitamine Vitamin D Vitamin D Vitamin D Vitamin D3 Vitamin D Vitamin D K2 Vitamin D D3 Vitamin D Vitamin D
Parent Child
Vitamine Vitamine
Vitamin D Vitamin D
Vitamin D Vitamin D3
Vitamin D Vitamin D K2
Vitamin D D3
Vitamin D Vitamin D 1000
Vitamin D Vitamin D 10000
Vitamin D Vitamin D 20000
Vitamin K2 Vitamin K2
Vitamin K2 Vitamin K
Vitamin K2 Vitamin K2 Mk7
Vitamin C Vitamin C
预计产量
Parent Child Sort_order
Vitamine Vitamine 1
Vitamin D Vitamin D 2
Vitamin D Vitamin D3 2.1
Vitamin D Vitamin D K2 2.2
Vitamin D D3 2.3
Vitamin D Vitamin D 1000 2.4
Vitamin D Vitamin D 10000 2.5
Vitamin D Vitamin D 20000 2.6
Vitamin K2 Vitamin K2 3
Vitamin K2 Vitamin K 3.1
Vitamin K2 Vitamin K2 Mk7 3.2
Vitamin C Vitamin C 4
考虑下表模式:
create table vitamins (
id serial primary key,
parent_id integer,
name varchar(64),
index smallint
);
使用以下数据:
insert into vitamins (id, parent_id, name, index) values
(1, null, 'Vitamine', 1),
(2, null, 'Vitamin D', 2),
(3, 2, 'Vitamin D3', 1),
(4, 2, 'Vitamin D K2', 2),
(5, 2, 'D3', 3),
(6, 2, 'Vitamin D 1000', 4),
(7, 2, 'Vitamin D 10000', 5),
(8, 2, 'Vitamin D 20000', 6),
(9, null, 'Vitamin K2', 3),
(10, 9, 'Vitamin K', 1),
(11, 9, 'Vitamin K2 Mk7', 2),
(12, null, 'Vitamin C', 4)
;
我们可以通过以下查询获得您想要的预期输出:
WITH RECURSIVE recursive_vitamins(id, parent_id, index, parent_name, name, ref, sort) AS (
SELECT c.id, c.parent_id, c.index, c.name, c.name, c.index::text, lpad(c.index::text, 3, '0')
FROM vitamins c
WHERE parent_id is null
UNION ALL
SELECT c.id, c.parent_id, c.index, rc.parent_name, c.name,
CASE WHEN rc.ref = '' THEN c.index::text
ELSE (rc.ref || '.' || c.index)
END, (rc.sort || '.' || lpad(c.index::text, 3, '0'))
FROM vitamins c, recursive_vitamins rc
WHERE c.parent_id = rc.id
)
SELECT
parent_name AS parent,
name AS child,
ref AS sort_order
FROM recursive_vitamins
ORDER BY sort;
结果:
parent child sort_order
Vitamine Vitamine 1
Vitamin D Vitamin D 2
Vitamin D Vitamin D3 2.1
Vitamin D Vitamin D K2 2.2
Vitamin D D3 2.3
...
等等,这里发生了什么事?
因此,我们创建了一个允许查询引用自己的输出的函数。
在WITH
查询中,我们首先选择所有父项(父项id为null
),然后选择引用父项id的所有子项
ref
字段是父索引和子索引的串联。排序
字段也引用了索引
,但它将索引
与0
的总长度设置为3。您可以忽略此项,只需按ref排序,但如果您有一个索引=10
,则顺序将变为1,10,10.1,2
,我想您可能不希望这样