在带有可选子集的无序集(数组)上匹配表

时间:2015-10-13 18:49:18

标签: arrays postgresql join multidimensional-array

我试图根据一组特征匹配两个表中的观察结果。

Table1:
id1;set1
A;{1,2,3,4}
B;{6,9,4,5}

Table2:
id2;set2
F;{1,2,3,4}
G;{7,6,2,4}
H;{6,{1,9},4,5}

理论集合是无序的,表1中集合的每个元素都应该与表2中的元素匹配,但是,当元素是子集时,表1中的元素应该属于表2中的子集。

结果应该是:

MATCH_TABLE: id1;id2 A;F B;H

" A"在表1中匹配" F"在表2中,很简单。 匹配" B"," H"更复杂。 set1的第二个元素," 1"属于" {1,9}"," H"中的子集,这就是全部匹配。

我应该如何在Postgresql中建模这些数据并执行此匹配?

PS:忽略具有子集的集合的情况H,我创建了set1和set2作为数组,对它们进行了排序,并且INNER在数组字段上加入了表。

1 个答案:

答案 0 :(得分:2)

安装intarray扩展程序,您可以在其中找到符合您需要的query_int类型。

create extension if not exists intarray;

create table table1 (id1 text, set1 int[]);
insert into table1 values
('A', '{1,2,3,4}'),
('B', '{6,9,4,5}');

create table table2 (id2 text, set2 query_int);
insert into table2 values
('F', '1 & 2 & 3 & 4'),
('G', '7 & 6 & 2 & 4'),
('H', '6 & (1 | 9) & 4 & 5');

select id1, id2
from table1
join table2
on set1 @@ set2

 id1 | id2
-----+-----
 A   | F
 B   | H
(2 rows)