Reputation: 333
I have a table
CREATE TABLE foo (text name, path ltree);
A couple of inserts
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');
Now I simply want to count the nodes under ROOT. I think I should do:
SELECT count(path) FROM foo
WHERE path ~ 'ROOT.*{1}'
I would expect 3 but I get 0. Any ideas?
Upvotes: 0
Views: 3053
Reputation: 333
Fount it! As with all things, RTFM is not a bad advice. The bundled Subpath function does the trick. Count distinct occurrences from offset 1, length 1:
select count(distinct subpath(path, 1, 1))
from foo
3.
Upvotes: 1
Reputation: 95552
You'd need either
WHERE path ~ 'ROOT.*{2}'
or
WHERE path ~ 'ROOT.*.parent'
That's because 'first.parent' is two labels, not one. The second WHERE clause looks for paths that end with 'parent', which I think makes your intent clearer.
You can see the sqlfiddle here.
Upvotes: 2