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

本文关键字:字符串 查找 列表 | 更新日期: 2023-09-27 17:55:34

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

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

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

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

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

如今,

一百万行是一个相对较小的数字。您应该能够将 A 列中的所有字符串以及表的主键拉入内存,并使用由 1000 个字符串组成的非常长的正则表达式进行正则表达式搜索:

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

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

最好的方法是使用 linq。假设你有你的清单

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

然后使用 Linq 你可以收缩

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

我建议查看全文搜索,它不会减少您必须执行的操作计数,但会提高性能。

假设你使用SQL服务器(你应该始终使用相关的标签来指定rdbms),
可以从List<string>创建DataTable,并将其作为表值参数发送到存储过程。

在存储过程中,可以使用该表值参数与 database_table.col contains(table_parameter.value) 上的表的简单联接(使用全文搜索)。当然,如果您按照Glorfindel评论中的建议创建全文索引,事情会更快