【问题标题】:SQL LIKE operator with parameters and wildcards带参数和通配符的 SQL LIKE 运算符
【发布时间】:2012-12-15 19:55:36
【问题描述】:

我有一个查询,我想返回名称中包含特定字符串且两边都带有通配符的所有客户端。所以输入可能是“史密斯”,我想返回所有的东西,比如“约翰史密斯公司”或“史密斯和兄弟”。我希望 [Client] 得到提示,所以我这样设置 SQL:

PARAMETERS Client Text ( 255 );
SELECT *
WHERE (((tbl_IncomingChecks.Client) Like'%' + [Client] + '%') 
ORDER BY tbl_IncomingChecks.Client;

查询未返回任何结果。请帮忙

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • 这可能太慢了。你的 SQL 是否支持CONTAINS 如果支持就使用它。
  • Access 中的连接语法是&,而不是+
  • @msmucker0527 通常最好使用 & 你说的,但你可以使用 + 只要你了解 + 如何与空值一起工作。

标签: sql ms-access parameters wildcard sql-like


【解决方案1】:

MS Access 使用 * 作为通配符而不是 %,因此您的查询将尝试匹配文字 '%' 字符。除非您使用 ADO,否则请改用 *。

http://office.microsoft.com/en-us/access-help/like-operator-HP001032253.aspx

【讨论】:

  • +1 Jet/ACE 的通配符有点复杂,因为它几乎在 MS Access 中使用时总是 *,但在 MS 之外使用 Jet?ACE 时是 %访问。
【解决方案2】:

我觉得你的问题出在“+”运算符上,不应该这样读

WHERE ((tbl_IncomingChecks.Client) Like Concat('%',[Client],'%')) 

这让我进入了 DB2

【讨论】:

  • 是但不是 DB2 或老式 mysql imo
  • 谢谢。我是新手,边走边捡。 CONCAT 是一个未定义的函数。我正在使用 access 2007
【解决方案3】:

您没有在语句中使用 from

PARAMETERS Client Text ( 255 );
SELECT * from table

【讨论】:

  • 我故意遗漏了所有的 select 语句。
【解决方案4】:

在MYSQL中使用REGEXP函数怎么样?

SELECT *
WHERE tbl_IncomingChecks.Client REGEXP concat('%', @Client, '%') 
ORDER BY tbl_IncomingChecks.Client;

或者只是简单地使用@client 作为REGEXP来查找包含此客户端名称的所有客户端:

SELECT *
WHERE tbl_IncomingChecks.Client REGEXP @Client
ORDER BY tbl_IncomingChecks.Client;

根据 OP 将 RDBMS 更新为 MS ACCESS

如果您有更复杂的模式,您可以在 MS Access UDF 中使用 Regexp 对象。但是在当前情况下,您最好使用LIKE Concat('*',@client,'*')

'-- you may even send the pattern as a parameter 
'-- you may also send all the clients into the UDF itself for matching
'-- returning a set of matched names string

Function regexpFunc(ByRef strInput As String, ByRef clientName as String) As Boolean
   Dim myRegex As New RegExp
   Dim matchSet As MatchCollection  

   With myRegex  
     .MultiLine = False  
     .Global = True  
     .IgnoreCase = False  
   End With  

   myRegex.Pattern = clientName

   If myRegex.Test(strInput) Then  
     'matching values can be collected here
     '-- Set matchSet = myRegex.Execute(strInput)
     RegexFunc = True
   Else
     RegexFunc = False           
   End If  
End Function

您可以在查询中使用上述函数:

SELECT *
FROM MYTABLE
WHERE RegexpFunc(tbl_IncomingChecks.Client, "Smith") 
ORDER BY tbl_IncomingChecks.Client;

【讨论】:

  • @user1940127 请查看 SQLFIDDLE 参考。如果您使用的是MYSQL, ORACLE,则“REGEXP”通常是一个更好的选择:)
  • 嗯,MS ACCESS 中没有“REGEXP”内置函数。我刚刚注意到您在 RDBMS 上的更新。但是有“正则表达式”对象 :) 如果您要匹配更大更复杂的模式,那么我建议您使用MS Access UDF。否则,您可以将 REGEXP 替换为 LIKE 以适应 MS ACCESS。
  • 我无法使用LIKE 函数来拉取任何东西。代码应该怎么读?
  • @user1940127 在 MS ACCESS 中,您应该使用 * 而不是 %,这是您需要为自己的查询进行的唯一更改。如果您碰巧需要这些,我已经为您提供了一种替代方法;)
猜你喜欢
  • 1970-01-01
  • 2013-02-08
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多