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

3

假设我有一些树形数据:

- 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

你能想到一种简单高效的方法来实现这个吗?虽然可以优化/修改模式,但并不是首选。

1个回答

2
您可以使用regexp_replace()获取父级,然后使用您正在使用的相同逻辑:
SELECT name, id, depth, terminal
FROM "tree-data"
WHERE 'A/A0/A0.0' LIKE regexp_replace(id, '/[^/]+$', '') || '%'
ORDER BY id;

谢谢,这是一种漂亮而优雅的方法,不需要我改变模式。 - quambo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接