postgresql查找字符串之间最小长度的常见模式

时间:2014-06-17 14:43:07

标签: sql postgresql

我正在使用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取得了一些成功,但我不能强制达到最小匹配长度条件(或者至少我不知道如何)。我假设一个正则表达式是这里的解决方案,但我还没有能够写出一个完成了我正在寻找的东西。

1 个答案:

答案 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行。然后操作归结为

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" ?
相关问题