说我有树数据:
- 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
您能想到一种简单有效的方法来实现这一目标吗?优化/修改模式是可能的,尽管不是首选方法。
您可以使用来获取父项regexp_replace(),然后使用与您相同的逻辑:
regexp_replace()
SELECT name, id, depth, terminal FROM "tree-data" WHERE 'A/A0/A0.0' LIKE regexp_replace(id, '/[^/]+$', '') || '%' ORDER BY id;