带有字符串路径的分层数据--查询一个节点,得到所有父节点和它们的第一层节点[英] Hierarchic data with string paths - query for a node, get all parents and first level of their nodes

本文是小编为大家收集整理的关于带有字符串路径的分层数据--查询一个节点,得到所有父节点和它们的第一层节点的处理方法,想解了带有字符串路径的分层数据--查询一个节点,得到所有父节点和它们的第一层节点的问题怎么解决?带有字符串路径的分层数据--查询一个节点,得到所有父节点和它们的第一层节点问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

假设我得到了树数据:

- A        A
-  A0      A/A0
-   A0.0   A/A0/A0.0
-   A0.1   A/A0/A0.1
-  A1      A/A1
-   A1.0   A/A1/A1.0
-   A1.1   A/A1/A1.1
-  A2      A/A2

它存储在 postgresql 数据库"tree-data"中,列 'id' 是节点的路径,如上所示,还有一些辅助列,如 'depth'(整数,表示树中的节点深度), 'terminal' (boolean, 是叶节点,没有子节点).

我现在想要实现的是对"A/A0/A0.0"的查询,它检索所有父母和他们的第一级孩子.

让所有父母都很容易:

SELECT name, id, depth, terminal
     FROM "tree-data"
     WHERE 'A/A0/A0.0' LIKE id||'%'
     ORDER BY id;

这将返回以下节点:

A
A/A0
A/A0/A0.0

但这正是我需要的:

A
A/A0
A/A0/A0.0
A/A0/A0.1
A/A1
A/A2

您能想出一种简单有效的方法来实现这一目标吗?优化/修改架构是可能的,但不是首选.

推荐答案

您可以使用 regexp_replace() 获取父级,然后使用您正在使用的相同逻辑:

SELECT name, id, depth, terminal
FROM "tree-data"
WHERE 'A/A0/A0.0' LIKE regexp_replace(id, '/[^/]+$', '') || '%'
ORDER BY id;

本文地址:https://www.itbaoku.cn/post/1764046.html