2017-02-10 13 views
0

我想将此结果缩短为仅返回具有所有行和顺序的超集的行在链中的列号的事项在Postgres中,是否可以使用数组列来过滤行,其值是其他行中包含的值的子集使用sql

不如认为这是例如路径在ltree(但动态使用递归CTE在这种情况下generated--)

si_id chain 
5 {3,5} 
5 {4,5} 
5 {8,5} 
2 {3,2} 
2 {4,2} 
1 {3,2,1} 
1 {3,5,1} 
1 {4,2,1} 
1 {4,5,1} 
1 {8,5,1} 

编辑,以显示期望的输出:

{3,2,1} 
{3,5,1} 
{4,2,1} 
{8,5,1} 
{4,5,1} 
+0

什么是期望的输出? –

+0

{3,5,1} {8,5,1} {4,2,1} {3,2,1} {4,5,1} – user7543032

+0

这是使用“{ 3,5}''作为'超集'例如在你的问题?结果必须包含第一个元素中的3个或第二个中的5个?为什么结果呈现'{4,2,1}'? –

回答

0

类似这样的:

WITH search AS (
    SELECT '{3,5,1}'::int4[] AS search, 
      array_upper('{3,5,1}'::int4[], 1) AS search_len 
) 
SELECT * 
FROM s 
JOIN search ON (chain @> search) 
WHERE EXISTS (
     SELECT 1 
     FROM generate_series(1, array_upper(chain, 1) - search_len + 1) AS i 
     WHERE chain[i:(search_len + i - 1)] = search 
) 
+0

这将返回与cte中的值相同的结果,并且如果我将值更改为{3},它将返回非超集还 我添加了对有关期望的输出是什么的问题发表评论 谢谢! – user7543032

相关问题