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