我有一个包含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
基本上 以某种方式我可以为每个序列找到每个序列的开始和结束位置,这样当我将来再次显示这个页面时,我不必计算 再次匹配并可以某种方式从数据库中选择有关开始和结束的数据,并以显示的格式显示 ?我知道这个问题可能有点模糊,但请 让我知道如果你有任何疑问我还能详细说明吗?
答案 0 :(得分:1)
第一种情况使用PATINDEX很容易。
案例1:
select Id, PATINDEX('%TCTGTTCTG%', strings) FROM table
这应该返回所有'完整'匹配的ID和匹配的起始位置。
案例2:
select id, PATINDEX('%T%C%T%G%T%T%C%T%G%', strings) FROM table
这个似乎返回部分匹配的值,不选择'最佳'部分匹配)
我会尽可能地回到它,从我看到的很多边缘情况。 (边缘情况:如果有多个完全匹配,你需要返回一个间隙最小的匹配或只是匹配间隙吗?部分匹配也是如此)
这应该给你一个开始,而我考虑其余部分。