从 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;