【问题标题】:Find each string in a list from a table column从表列中查找列表中的每个字符串
【发布时间】:2023-03-24 14:05:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我想包含 A 列的表在数据库中,而列表 L 在您的 C# 程序中?
  • 听起来你需要full text index

标签: c# sql


【解决方案1】:

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

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

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

【讨论】:

  • 我更熟悉这个选项,所以我选择这个作为我的问题的答案。但我相信其他选择也很棒。谢谢大家。
【解决方案2】:

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

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

然后使用 Linq 就可以进行收缩了

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

【讨论】:

  • 如果您需要更多解释,请告诉我
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    假设你使用Sql server(你应该总是使用相关标签来指定rdbms),
    您可以从您的List&lt;string&gt; 创建一个DataTable 并将其作为table valued parameter 发送到存储过程。

    在存储过程中,您可以将该表值参数简单地连接到 database_table.col contains(table_parameter.value) 上的表(使用 full text search)。 当然,如果您按照 Glorfindel 的 cmets 中的建议创建 full text index,事情会变得更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多