2017-10-08 97 views
0

我需要编写一个SQL(或一个SQL函数)来检查Postgres项目是否包含该项目的一部分。我会把这个项目称为'Item'。所以基本上“项目”是这样的:检查Postgres数组是否按顺序包含子数组

enter image description here

E1的大小总是一样的E2。

现在来看2个数组,我将它们称为a1和a2,它看起来像这样。

'{b,c,d}','{2,3,4}'。

e2(a2)中的值必须与e1(a1)中的索引完全匹配,因此在本例中,表中的第1项和第4项都匹配,但不匹配第2个或第3个项。所以如果2个数组是'{c,d}','{3,4}',那么第1,第3和第4项将匹配。

我不知道如何做到这一点,我是否需要使用类似generate_series()的东西来生成项目的所有可能的切片,然后检查?我现在有点困惑。

+0

您好。今后请不要发布数据截图;相反,使用该网站的格式化功能来显示表格等。这可以让人们以后搜索,并帮助有视力困难的读者。它还可以帮助人们帮助你,因为他们可以在测试时复制和粘贴你的样本数据。谢谢! –

+0

为了其他读者的利益,'@>'操作符在这里没有帮助,因为它不遵守顺序,这是一个集合操作。 –

+0

对不起,这是我第一次在stackoverflow上提问。我不会再这样做:) – GrandmaChen

回答

0

该功能将子阵列sub,或0的阵列arr中返回一个索引如果arr不包含sub

create or replace function index_of_subarray(arr anyarray, sub anyarray) 
returns integer language plpgsql immutable as $$ 
begin 
    for i in 1 .. cardinality(arr)- cardinality(sub)+ 1 loop 
     if arr[i:i+ cardinality(sub)- 1] = sub then 
      return i; 
     end if; 
    end loop; 
    return 0; 
end $$; 

使用:

with my_table(e1, e2) as (
values 
    ('{a,b,c,d}'::text[], '{1,2,3,4}'::int[]), 
    ('{b,c,d,a}', '{1,2,3,4}'), 
    ('{c,d}', '{3,4}'), 
    ('{b,c,d}', '{2,3,4}') 
) 

select e1, e2 
from my_table 
where index_of_subarray(e1, '{b,c,d}') > 0 
and index_of_subarray(e1, '{b,c,d}') = index_of_subarray(e2, '{2,3,4}') 

    e1  | e2  
-----------+----------- 
{a,b,c,d} | {1,2,3,4} 
{b,c,d} | {2,3,4} 
(2 rows)  
相关问题