从 Postgres ltree 路径获取直接子级

Dul*_*ula 1 postgresql ltree

ltree假设路径始终从根开始,如何从 Postgres 中的类型中的给定路径获取直接子级?例如,如果给定的路径是A.B并且列名是ltreepath那么我能想到的最好的方法是:

SELECT distinct(subpath(path, (SELECT distinct(nlevel('A.B'))), 1)) FROM test_ltree WHERE path ~ 'A.B.*{1,}';';

编辑:我只想返回孩子,而路径中没有父母。

Lau*_*lbe 6

这应该是微不足道的:

\n
TABLE ltree;\n\n id \xe2\x94\x82  path   \n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n  1 \xe2\x94\x82 A\n  2 \xe2\x94\x82 A.B\n  3 \xe2\x94\x82 A.B.C\n  4 \xe2\x94\x82 A.B.D\n  5 \xe2\x94\x82 A.B.D.E\n  6 \xe2\x94\x82 A.F\n(6 rows)\n\nSELECT * FROM ltree\nWHERE path ~ 'A.B.*{1}'::lquery;\n\n id \xe2\x94\x82 path  \n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n  3 \xe2\x94\x82 A.B.C\n  4 \xe2\x94\x82 A.B.D\n(2 rows)\n
Run Code Online (Sandbox Code Playgroud)\n

该查询查找 的所有直接子代A.B

\n

如果您想A.B从结果中省略 ,请使用subpath负偏移量:

\n
SELECT subpath(path, -1)\nFROM ltree\nWHERE path ~ 'A.B.*{1}'::lquery;\n\n subpath \n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n C\n D\n(2 rows)\n
Run Code Online (Sandbox Code Playgroud)\n

要仅获取之后的下一个标签A.B,您可以尝试

\n
SELECT DISTINCT subpath(subpath(path, nlevel('A.B')), 0, 1)\nFROM ltree\nWHERE path ~ 'A.B.*{1,}'::lquery;\n
Run Code Online (Sandbox Code Playgroud)\n