ltree假设路径始终从根开始,如何从 Postgres 中的类型中的给定路径获取直接子级?例如,如果给定的路径是A.B并且列名是ltree,path那么我能想到的最好的方法是:
SELECT distinct(subpath(path, (SELECT distinct(nlevel('A.B'))), 1)) FROM test_ltree WHERE path ~ 'A.B.*{1,}';';
编辑:我只想返回孩子,而路径中没有父母。
这应该是微不足道的:
\nTABLE 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)\nRun Code Online (Sandbox Code Playgroud)\n该查询查找 的所有直接子代A.B。
如果您想A.B从结果中省略 ,请使用subpath负偏移量:
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)\nRun Code Online (Sandbox Code Playgroud)\n要仅获取之后的下一个标签A.B,您可以尝试
SELECT DISTINCT subpath(subpath(path, nlevel('A.B')), 0, 1)\nFROM ltree\nWHERE path ~ 'A.B.*{1,}'::lquery;\nRun Code Online (Sandbox Code Playgroud)\n