2017-10-08 96 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)  
相關問題