ltree
假设路径总是从根开始,如何从 Postgres中的类型中的给定路径获取直接子级?例如,如果给定的路径是A.B
,列名ltree
是path
,那么我能想到的最好的方法是:
SELECT distinct(subpath(path, (SELECT distinct(nlevel('A.B'))), 1)) FROM test_ltree WHERE path ~ 'A.B.*{1,}';';
编辑:我只想返回孩子,没有父母在路上。
ltree
假设路径总是从根开始,如何从 Postgres中的类型中的给定路径获取直接子级?例如,如果给定的路径是A.B
,列名ltree
是path
,那么我能想到的最好的方法是:
SELECT distinct(subpath(path, (SELECT distinct(nlevel('A.B'))), 1)) FROM test_ltree WHERE path ~ 'A.B.*{1,}';';
编辑:我只想返回孩子,没有父母在路上。
这应该是微不足道的:
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;