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 不使用 Gist 索引 为啥?