postgresql查找字符串之间最小长度的通用模式

postgresql查找字符串之间最小长度的通用模式,sql,postgresql,relational-division,Sql,Postgresql,Relational Division,我使用的是postgresql 9.3,我正在尝试内部连接最小长度的公共字符串模式上的两个表 我也是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

我使用的是postgresql 9.3,我正在尝试
内部连接
最小长度的公共字符串模式上的两个表

我也是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'

我成功地使用了
之类的
,但我不能强制设置最小匹配长度条件(或者至少我不知道如何设置)。我假设正则表达式是这里的解决方案,但我还没能编写一个能够完成我所寻找的内容的正则表达式。

您的示例匹配2 x 4个字符,而不是
超过9个字符

我建议使用数组类型(
int[]
)而不是字符类型,并结合来自。更多详细信息:
-
-

查询可能是这样的

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" ?
效率不是很高,这种交叉连接不能很好地扩展

规范化 更快的选择:一个规范化的模式,每个数据项一行。然后,这个操作归结为一个问题

那么查询可以是:

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" ?
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" ?