Postgres - 使用 ltree 计算级别(下)的孩子

Posted

技术标签:

【中文标题】Postgres - 使用 ltree 计算级别(下)的孩子【英文标题】:Postgres - Counting children in level (below) using ltree 【发布时间】:2014-02-01 01:59:02 【问题描述】:

我有一张桌子

CREATE TABLE foo (text name, path ltree);

几个插入

INSERT INTO foo (name, path) VALUES ( 'Alice', 'ROOT.first.parent');
INSERT INTO foo (name, path) VALUES ( 'Bob', 'ROOT.second.parent');
INSERT INTO foo (name, path) VALUES ( 'Mistress', 'ROOT.third.parent');
INSERT INTO foo (name, path) VALUES ( 'Ted', 'ROOT.first.parent.child');
INSERT INTO foo (name, path) VALUES ( 'Carol', 'ROOT.second.parent.child');

现在我只想计算 ROOT 下的节点。我想我应该这样做:

SELECT count(path) FROM foo
WHERE path ~ 'ROOT.*1'

我希望得到 3,但我得到 0。有什么想法吗?

【问题讨论】:

【参考方案1】:

你需要任何一个

WHERE path ~ 'ROOT.*2'

WHERE path ~ 'ROOT.*.parent'

那是因为“first.parent”是两个标签,而不是一个。第二个 WHERE 子句查找以 'parent' 结尾的路径,我认为这会让您的意图更加清晰。

你可以看到sqlfiddle here。

【讨论】:

让我改写一下:ROOT 有 n 个孩子(在这种情况下是 3 个)。我不知道他们的标签。我如何计算它们? WHERE path ~ 'ROOT.*2' 是误报,因为 Alice、Bob 和 Mistress 正好有 3 个级别。对错误问题的正确答案。 一个 lquery 不会回答这个问题,但 subpath() 函数会。你已经知道了。 ;)【参考方案2】:

找到了!与所有事物一样,RTFM 并不是一个坏建议。捆绑的 Subpath 函数可以解决问题。计算偏移量 1、长度 1 的不同出现次数:

select count(distinct subpath(path, 1, 1))
from foo

3.

【讨论】:

以上是关于Postgres - 使用 ltree 计算级别(下)的孩子的主要内容,如果未能解决你的问题,请参考以下文章

休眠查询中的 Postgres ltree

Postgres ltree 不使用 Gist 索引 为啥?

Postgres 递归 LTREE 查找

在PostgreSQL中使用ltree处理层次结构数据

从使用物化路径编码树的表中选择,按深度优先排序(无递归/ltree)

如何从应用程序级别设置 postgres 查询执行超时?