2017-04-20 99 views
1

我一直在使用Postgres ltree构造来存储分层结构。现在,我想收集树中的所有叶节点。有没有一个简单的机制来做到这一点?用Postgres收集所有叶子节点ltree

CREATE TABLE foo 
AS 
    SELECT node::ltree 
    FROM (VALUES 
    ('Top.Astronomy'), 
    ('Top.Astronomy.Astrophysics'), 
    ('Top.Pictures'), 
    ('Top.Pictures.Stars') 
) AS t(node); 

我如何返回

Top.Astronomy.Astrophysics 
Top.Pictures.Stars 
+0

任何新的信息? –

回答

1

使用@>

的一种方法是使用contains operator @>

SELECT * 
FROM foo AS f1 
WHERE NOT EXISTS (
    SELECT * 
    FROM foo AS f2 
    WHERE f1.node @> f2.node 
    AND f1.node <> f2.node 
); 
      node    
---------------------------- 
Top.Astronomy.Astrophysics 
Top.Pictures.Stars 
(2 rows) 
1

如果叶子总是处于第三层次,做到这一点:

SELECT * FROM foo WHERE node ~ '*{2}.*'; 

量词非常有用。您也可以在长分支中找到节点。要使用在文档PostgreSQL的示例性测试表在https://www.postgresql.org/docs/current/static/ltree.html

SELECT * FROM test WHERE path ~ '*{2}.Astronomy.*{1}'; 

将在四长度分支的第三只匹配“天文”。

您也可以将另一列作为标志来指示它是否为叶。 ()@BTW @ <>运算符需要主要索引,并且我发现它在一个大型数据集中速度要慢很多,我删除它并使用了btree〜运算符我拿出来了,它工作的很好,只是没有我猜。)