1

我有一个包含 2 列的表,一个是 id,另一个是包含长字符串的列,例如。

Id  strings
1   AGTTAGGACCTTACTCTATATCTGTTCTGTTGGTATGGAG
2   GTACTTGTATTCTGATATCTAGGGTTTTCTAATTACTTCTG
3   GTATTCTCTTTCTAGCTGATCGTAATTAAATCTTATCTAA

当用户执行搜索时,我会在搜索字符串中找到最长的公共子序列以及表中的所有数据。例如。搜索顺序是

TCTGTTCTG

1.  Its a 100% match, with the whole match found.
2.  The LCS is TCTGTTCTG, but with some gaps.
3.  The LCS is TCTGTTCT, with some gaps in BTW.

有没有办法存储关于匹配的信息,它从哪里开始找到匹配,然后到哪里找到匹配,然后又从哪里开始等等?所以,我可以用这种格式来表示数据

First one   =>

AGTTAGGACCTTACTCTATATCTGTTCTGTTGGTATGGAG
                    |||||||||
                    TCTGTTCTG

Second one =>

GTACTTGTATTCTGATATCTAGGGTTTTCTAATTACTTCTG
 | || |  |||||
 T CT G  TTCTG

基本上我可以以某种方式存储每个找到的子序列的每个序列的开始和结束位置,这样当我以后再次显示这个页面时,我不必再次计算这个匹配,并且可以以某种方式挑选出关于开始和的数据从数据库结束并以所示格式显示?我知道这个问题可能有点模糊,但是如果您有任何疑问,请告诉我我还能如何详细说明?

4

1 回答 1

1

第一种情况很容易使用 PATINDEX。

情况1:

select Id, PATINDEX('%TCTGTTCTG%', strings) FROM table

这应该返回所有“完整”匹配的 ID 和匹配的起始位置。

案例二:

select id, PATINDEX('%T%C%T%G%T%T%C%T%G%', strings) FROM table

这似乎返回一个部分匹配的值,不选择“最佳”部分匹配)

当我可以的时候,我会回到它,从我所看到的很多边缘情况来看。(边缘情况:如果有多个完全匹配怎么办,你需要返回一个间隙最少的匹配还是只返回一个有间隙的匹配?部分匹配也是如此)

这应该给你一个开始,而我会考虑剩下的部分。

于 2013-10-24T16:51:49.993 回答