2013-07-02 84 views
1

作爲測試我創造了這個模式:PostgreSQL的 - 基本數組和ARRAY_AGG

CREATE TABLE simple_table (client_id int4, order_id int4); 
INSERT INTO simple_table (client_id, order_id) 
VALUES 
(1,2),(1,3),(1,4),(1,6),(1,8),(1,12),(1,16),(1,18),(1,25),(1,32),(1,33),(1,37),(1,43), 
(1,56),(1,57),(1,66),(2,2),(2,3),(2,5),(2,7),(2,9),(2,12),(2,17),(2,19),(2,22),(2,30), 
(2,33),(2,38),(2,44),(2,56),(2,58),(2,66) 
; 



然後使用ARRAY_AGG:

SELECT client_id, array_agg(order_id) FROM simple_table GROUP BY client_id; 



創建數組客戶端1和客戶端2:

現在3210
| CLIENT_ID |         ARRAY_AGG | 
---------------------------------------------------------- 
|   1 | 2,3,4,6,8,12,16,18,25,32,33,37,43,56,57,66 | 
|   2 | 2,3,5,7,9,12,17,19,22,30,33,38,44,56,58,66 | 



我想比較的2行標識類似的值。從Postgresql文檔試過&& overlap (have elements in common) ARRAY[1,4,3] && ARRAY[2,1],但我遇到了問題。

也許我看着這個錯誤。任何幫助或指導,將不勝感激!

+0

感謝,包括樣本數據,你在做什麼試圖實現+1。但是,如果您能夠準確地顯示出您遇到的問題(意外的結果,錯誤消息等)以及您運行的SQL的* exact *文本,那就太好了。最後,請始終在問題中包含PostgreSQL版本('SELECT version()')。 –

+0

對不起。 9.2在OSX上10.6.8 –

回答

2

&&操作者是產生一個或truefalse結果,而不是值的列表的謂詞。

如果你正在尋找的是存在兩種client_id=1client_id=2order_id列表,查詢是:

select order_id from simple_table where client_id in (1,2) 
    group by order_id having count(*)=2; 

如果你考慮到這些陣列是這相當於兩個數組的交叉點集(沒有重複和值的位置是無關緊要的),除了你根本不需要使用數組之外,簡單的標準SQL就足夠好了。

+0

完美!正是我在找什麼!謝謝丹尼爾!因此,如果我有多個client_id: '我在(1,2)' 中的client_id將寫入: 'where client_id in(1,2,3,4)'? –

+0

是的,'count(*)= 4' –

+0

太棒了!再次感謝! –

0

看看在「array_intersect」這裏的功能: Array Intersect

一看就知道是常見的兩種數組中的元素:

create or replace function arrxor(anyarray,anyarray) returns anyarray as $$ 
select ARRAY(
     (
     select r.elements 
     from (
       (select 1,unnest($1)) 
       union all 
       (select 2,unnest($2)) 
       ) as r (arr, elements) 
     group by 1 
     having min(arr) = max(arr) 
     ) 
) 
$$ language sql strict immutable; 
+0

謝謝BMA!很有幫助。我感謝您的幫助!! –