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

时间:2014-02-01 01:59:02

标签: sql postgresql ltree

我有一张桌子

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.任何想法?

2 个答案:

答案 0 :(得分:1)

你需要

WHERE path ~ 'ROOT.*{2}'

WHERE path ~ 'ROOT.*.parent'

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

您可以看到sqlfiddle here

答案 1 :(得分:1)

Fount it!与所有事情一样,RTFM并不是一个糟糕的建议。捆绑的子路径功能可以解决这个问题。计算偏移量1,长度1:

的不同出现次数
select count(distinct subpath(path, 1, 1))
from foo

3