从 Postgres ltree 路径立即获取 children
Get immediate children from Postgres ltree path
假设路径始终从根目录开始,我如何从 Postgres 中 ltree
类型的给定路径获取直接 children?例如,如果给定的路径是 A.B
并且 ltree
的列名称是 path
,那么我能想到的最好的是:
SELECT distinct(subpath(path, (SELECT distinct(nlevel('A.B'))), 1)) FROM test_ltree WHERE path ~ 'A.B.*{1,}';';
编辑:我只想 return children,路径中没有 parents。
这应该是微不足道的:
TABLE ltree;
id │ path
════╪═════════
1 │ A
2 │ A.B
3 │ A.B.C
4 │ A.B.D
5 │ A.B.D.E
6 │ A.F
(6 rows)
SELECT * FROM ltree
WHERE path ~ 'A.B.*{1}'::lquery;
id │ path
════╪═══════
3 │ A.B.C
4 │ A.B.D
(2 rows)
查询查找 A.B
.
的所有直接子代
如果要从结果中省略 A.B
,请使用带有负偏移量的 subpath
:
SELECT subpath(path, -1)
FROM ltree
WHERE path ~ 'A.B.*{1}'::lquery;
subpath
═════════
C
D
(2 rows)
要仅获取 A.B
之后的下一个标签,您可以尝试
SELECT DISTINCT subpath(subpath(path, nlevel('A.B')), 0, 1)
FROM ltree
WHERE path ~ 'A.B.*{1,}'::lquery;
假设路径始终从根目录开始,我如何从 Postgres 中 ltree
类型的给定路径获取直接 children?例如,如果给定的路径是 A.B
并且 ltree
的列名称是 path
,那么我能想到的最好的是:
SELECT distinct(subpath(path, (SELECT distinct(nlevel('A.B'))), 1)) FROM test_ltree WHERE path ~ 'A.B.*{1,}';';
编辑:我只想 return children,路径中没有 parents。
这应该是微不足道的:
TABLE ltree;
id │ path
════╪═════════
1 │ A
2 │ A.B
3 │ A.B.C
4 │ A.B.D
5 │ A.B.D.E
6 │ A.F
(6 rows)
SELECT * FROM ltree
WHERE path ~ 'A.B.*{1}'::lquery;
id │ path
════╪═══════
3 │ A.B.C
4 │ A.B.D
(2 rows)
查询查找 A.B
.
如果要从结果中省略 A.B
,请使用带有负偏移量的 subpath
:
SELECT subpath(path, -1)
FROM ltree
WHERE path ~ 'A.B.*{1}'::lquery;
subpath
═════════
C
D
(2 rows)
要仅获取 A.B
之后的下一个标签,您可以尝试
SELECT DISTINCT subpath(subpath(path, nlevel('A.B')), 0, 1)
FROM ltree
WHERE path ~ 'A.B.*{1,}'::lquery;