1

テストとして、私はこのスキーマを作成しました:

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 のアレイを作成するには:

| 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 つの行を比較して、同様の値を識別したいと思います。&& overlap (have elements in common) ARRAY[1,4,3] && ARRAY[2,1]Postgresql のドキュメントから 試してみましたが、問題が発生しています。

おそらく私はこれを間違って見ています。ヘルプやガイダンスをいただければ幸いです。

4

2 に答える 2

2

&&演算子は、値のリストではなく、または結果を生成する述語ですtruefalse

と の両方にorder_id存在するのリストを探している場合、クエリは次のようになります。client_id=1client_id=2

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

これらの配列がセットである (重複がなく、値の位置が無関係である) と考える場合、これは 2 つの配列の交点に相当しますが、配列をまったく使用する必要がないことを除けば、単純な標準 SQL で十分です。

于 2013-07-02T22:38:13.643 に答える
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;
于 2013-07-02T22:39:07.583 に答える