我正在使用postgresql 9.3而我正在尝试inner join
关于最小长度的常见字符串模式的两个表。
另外,如果可能的话,我会尝试耐心等待SQL。
例如:
TABLE 1
ID DATA
1 '1234,5678,1234,1111'
2 '1111,2222'
3 '4321'
TABLE 2
IDa DATA
1a '1111,2222,1234,5678,4321'
2a '1111,3837,2222'
3a '4321'
在匹配超过9个字符的字符串上加入DATA
列将产生:
IDa ID DATA
1a 2 '1111,2222'
1a 1 '1234,5678'
我使用LIKE
取得了一些成功,但我不能强制达到最小匹配长度条件(或者至少我不知道如何)。我假设一个正则表达式是这里的解决方案,但我还没有能够写出一个完成了我正在寻找的东西。
答案 0 :(得分:1)
您的示例匹配2 x 4个字符,而不是more than 9 chars
。
我建议使用数组类型(int[]
)而不是字符类型,并结合intersection operator &
中方便的additional module intarray。更多细节:
- Error when creating unaccent extension on PostgreSQL
- Postgresql intarray error: undefined symbol: pfree
查询可能如下所示
SELECT t2.ida, t1.id, t1.data & t2.data AS intersecting_data
FROM tbl1 t1
JOIN tbl2 t2 ON array_length(t1.data & t2.data, 1) = 2; -- or "> 1" ?
效率不高,这种交叉连接不能很好地扩展。
更快的替代方案:标准化架构,每个数据项有1行。然后操作归结为relational-division。
tbl1_data
tbl1_id item
1 1234
1 5678
1 1234
1 1111
2 1111
...
tbl2_data
tbl1_id item
1a 1111
1a 2222
...
然后查询可能是:
SELECT tbl1_id, tbl2_id, array_agg(item) AS data
FROM tbl1_data d1
JOIN tbl2_data d2 USING (item)
GROUP BY 1,2
HAVING count(*) = 2; -- or "> 1" ?