小编典典

具有字符串路径的分层数据-查询节点,获取其节点的所有父级和第一级

sql

说我有树数据:

- 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” ‘(布尔值,是叶节点,没有子代)。

我现在想要实现的是查询“ 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

您能想到一种简单有效的方法来实现这一目标吗?优化/修改模式是可能的,尽管不是首选方法。


阅读 174

收藏
2021-04-28

共1个答案

小编典典

您可以使用来获取父项regexp_replace(),然后使用与您相同的逻辑:

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