从表列中查找列表中的每个字符串

时间:2015-06-11 15:28:10

标签: c# sql

我有一张大约有100万行的表。其中一列是字符串,我们称之为A列。

现在我需要处理大约1,000个字符串的列表L,大多数是一个或两个单词,我需要找到表中的所有记录,其中列A包含列表L中的1,000个字符串之一。

我能想到的唯一方法是使用L中的每个字符串进行全表扫描,查找字符串是否是每行的A列内容的子字符串。但那将是O(n2),对于一百万行,它将花费很长时间。

有更好的方法吗?在SQL中还是在C#代码中?

4 个答案:

答案 0 :(得分:1)

如今,一百万行的数量相对较少。您应该能够将A列中的所有字符串与表的主键一起提取到内存中,并使用由1000个字符串组成的非常长的正则表达式进行正则表达式搜索:

var regex = new Regex("string one|string two|string three|...|string one thousand");

由于正则表达式被编译成最终的自动机,因此您的字符串扫描时间会相当快。完成过滤后,收集ID,并使用它们从表中查询完整行。

答案 1 :(得分:1)

最好的方法是使用linq。让我们说你有你的清单

List<string> test = new List<string>{"aaa","ddd","ddsc"};

然后使用Linq你可以构思

var match = YourTable.Where (t=> test.Contains(t.YourFieldName);

答案 2 :(得分:0)

我建议查看full text search,它不会减少您必须执行的操作次数,但会提高性能。

答案 3 :(得分:0)

假设您使用Sql server(您应该始终使用相关标签来指定rdbms ),
您可以从DataTable创建List<string>,并将其作为table valued parameter发送到存储过程。

在存储过程中,您可以使用该表值参数的简单连接到database_table.col contains(table_parameter.value)上的表(使用full text search)。 当然,如果您按照full text index

的评论中的建议创建Glorfindel,事情会更快