【问题标题】:Query Access with wildcard使用通配符查询访问
【发布时间】:2011-11-04 05:32:49
【问题描述】:

我正在尝试从 winforms 中的 access 2010 数据库中进行子字符串搜索。

command.Parameters.AddWithValue("@searchTerm", searchTerm);
command.CommandText = "SELECT [OA_Name] FROM [Operating_Authority_Table] WHERE [OA_Name] = [@%searchTerm%]";

我尝试进行完整的字符串搜索并且能够做到这一点,但是当我将术语更改为子字符串时,我无法获得任何成功的搜索。

我是否错误地使用了通配符?

【问题讨论】:

    标签: c# sql ms-access oledb wildcard


    【解决方案1】:

    试试这样的:

    command.Parameters.AddWithValue("@searchTerm", searchTerm); 
    command.CommandText = "SELECT [OA_Name] FROM [Operating_Authority_Table] WHERE [OA_Name] = '%' + @searchTerm + '%'";
    

    【讨论】:

    • 顺便说一句,对于可能有类似问题的人,我已经尝试过,发现 '%' 有效,'*' 无效。
    • 感谢您的反馈,我会从我的答案中编辑它。 % 适用于几乎所有主要数据库(SQL Server、Oracle、DB2 等)。出于某种原因,我认为 Access 很特别。
    • 访问特殊的;它确实在其“传统” SQL 方言中使用星号作为通配符,但它也支持另一种符合 ansi-92 标准的语法。
    • @phoog:所谓的ANSI-92 Query Mode符合 SQL-92 标准,甚至在入门级也不符合。 MS 声称它“非常符合”,这是我强烈反驳的主观观点。此外,相同的文档声称有关 Access 引擎的各种事情显然是不真实的!另请参阅我关于使用ALIKE(对Access 来说是“特殊的”)而不是LIKE 的回答。
    【解决方案2】:

    接受的答案:

    "...WHERE [OA_Name] = '%' + @searchTerm + '%'";
    

    这会将% 字符视为文本文字。

    我有点惊讶,因为问题标题中的“通配符”一词表明其意图是用于模式匹配。如果确实如此,我建议将 = 相等运算符替换为 ALIKE 运算符,例如

    "...WHERE [OA_Name] ALIKE '%' + @searchTerm + '%'";
    

    LIKE 运算符的问题在于 Access 数据库引擎(ACE、Jet 等)根据所谓的ANSI Query Mode 使用不同的通配符。据推测,您使用 ANSI-92 查询模式意味着使用 SqlOleDb(但您肯定知道吗?)

    ALIKE 的优势在于无论 ANSI 查询模式如何,它都使用相同的“标准”通配符,% 用于多个字符,_ 用于单个字符。

    【讨论】:

      【解决方案3】:

      尝试使用SQL LIKE Operator

       command.CommandText = "SELECT [OA_Name] FROM [Operating_Authority_Table] WHERE [OA_Name] LIKE '%"+ searchTerm +"%'";
      

      【讨论】:

      • 我同时使用了 = 和 LIKE,当我尝试进行完整的字符串匹配时,它们都为我工作。