数据表,多个搜索词,多个列

本文关键字:搜索 数据表 | 更新日期: 2023-09-27 18:36:36

>我有几个搜索词,我必须与数据库(现有的 Access 数据库)的多个字段匹配,返回与所有术语匹配的任何记录,无论哪个字段与哪个术语匹配。

假设搜索词是:"约翰,波士顿"和"伦敦",目标字段是"姓名,姓氏"和"城市"。

我必须找到两个:一个叫"来自伦敦的约翰·波士顿"和一个名叫"来自波士顿的约翰·伦敦"的人

据我尝试过:

        string initialQuery = "SELECT * FROM clientTable WHERE name like '%firstTerm%' or surname like '%firstTerm%' or city like '%firstTerm%'";
        var queryDs = new DataSet();
        OleDbDataAdapter clientesDa;
        OleDbConnection con = CreateOleDbConnection();
        clientesDa = new OleDbDataAdapter(initialQuery, con);
        clientesDa.Fill(queryDs, tableName);
        DataTable resultDataTable = queryDs.Tables["clientTable"];
        DataRow[] clientes = resultDataTable.Select("name like '%secondTerm%' or surname like '%secondTerm%' or city like '%secondTerm%'");

我不知道如何进一步过滤生成的Datarow[],而且我想一定有更好的方法来做到这一点。

只能用SQL来完成吗?

可以使用连续的 LINQ 筛选器来完成吗?

如何在 C# 中完成?

数据表,多个搜索词,多个列

由于

注释大小限制,添加为另一个答案:

我现在必须处理另一个问题,但对你的问题最简单的答案是:让数据库为你工作。 这就是它们的设计目的。 您超越了一个initialQuery使问题过于复杂 - 可以使用 C# 构建单个适当的查询字符串来解决整个查询:

SELECT DISTINCT blah blah blah   -- what data you want?
FROM some_tables                 -- where do you want it from?
WHERE important stuff here       -- THIS IS YOUR QUESTION!!!

IOW,您在这里最好做的是使用复合 WHERE 子句构建单个 SQL 查询,该子句反映了将结果集限制为您实际想要的参数

记得:

SQL是一种面向集合的语言。
C#/C++/Java/大多数其他专业语言都是声明式/OO语言。

这是一个重要的区别。 它们不仅面向不同的问题,而且存在于完全不同的问题中。

你在SQL中的问题很简单。 一个查询,具有适当的WHERE条款和条件。 就是这样。

然而,在像 C# 这样的语言中,它变成了一个更困难的问题——我们必须实际创建那些"适当的"WHERE 子句和条件。 所有这些都将我们引回到第一点,稍微重新措辞:让语言为你工作。 在给定适当的查询字符串的情况下,在SQL中搜索数据库很棒。 实际上,在SQL中构建这些查询字符串很糟糕。 在 C# 中并非如此,反之亦然。

因此,请使用您大部分工作所使用的语言的优势。 在您的情况下,我们似乎在谈论 C#。

那么:您希望 SQL 查询是什么样子的? 使用 C# 生成它,然后只需执行它即可获得所需的结果集。

一个查询,适当构造。 C# 来构建它,然后使用数据库引擎实际执行它(注意:无论是 Access、MS-SQL 还是其他什么都没关系 - 让 ODBC 来承担这个打击)。

作为给定示例的起点,请考虑您可能想要做什么来生成(使用 C#)以下字符串(主要是伪代码,再次超出我的头顶):

SELECT               -- well, you want some data, right?
DISTINCT             -- you don´t want to dup *every* record matching the WHERE clause
*                    -- your code assumes you want *all* fields for a matching record
FROM clientTable     -- you only specified one table to search
WHERE                -- now HERE´s the part that matters:
(
  name LIKE %firstTerm%   
  OR name LIKE %secondTerm%
  OR name LIKE %thirdTerm%
)
OR
(
  surname LIKE %firstTerm% 
  OR surname LIKE %secondTerm%
  OR surname LIKE %thirdTerm%
)
OR
(
  city LIKE %firstTerm% 
  OR city LIKE %secondTerm%
  OR city LIKE %thirdTerm%
)

还有其他几种(更好/更干净/专家)的方法可以做到这一点,但这通常是最基本的方面:您需要创建什么查询字符串才能满足您的要求? 作为奖励,这种方法(使数据库在数据库领域工作)通常比创建数据子集、将它们查询到另一个子集中等要快得多。 一个查询(只要有可能),具有多个 WHERE 子句可能比创建和重复/递归查询临时数据集快几个数量级。

警告:没有任何即兴代码可以按原样工作。 仅供说明之用。张贴在我出门的路上。