如何构建正确的Access SQL LIKE运算符表达式?

时间:2018-11-16 22:53:21

标签: sql ms-access

我正在尝试让用户搜索Microsoft Access 2010中的表,但是SQL命令不起作用。加载和刷新表的命令是这样的:

SELECT Equipment.equipmentID, Equipment.equipmentName, Equipment.model, 
Equipment.make, Equipment.equipmentLocation FROM Equipment ORDER BY Equipment.equipmentName; 

这可行,但是当我尝试使用变量(或任何常规条件)时:

searchItem = Me.searchBox.Value
Me.List64.RowSource = "SELECT Equipment.equipmentID, Equipment.equipmentName,
Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment 
WHERE Equipment.equipmentName LIKE '%searchItem%' ORDER BY Equipment.equipmentName;"

我也尝试过类似“%10%”的方法,而不是searchItem变量,但是该命令使表空白无误。我怀疑问题出在设备.eqiupmentName作为列名,但是我不太清楚这里出了什么问题。

快速浏览一下表格的外观:

test

2 个答案:

答案 0 :(得分:3)

尝试一下:

Me.List64.RowSource = & _
    "SELECT Equipment.equipmentID, Equipment.equipmentName," & _
        " Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment" & _
    " WHERE Equipment.equipmentName LIKE '*" & searchItem & "*'" & _
    " ORDER BY Equipment.equipmentName;"
  • 用户 rjt011000 具有有效的解决方案,但我建议在VBA(和Access)中使用&进行字符串连接。有关+和&的说明,请参见this thread

  • Access无法识别或替换SQL语句中的VBA变量。此外,在这种情况下,向LIKE运算符提供了SQL字符串值(在单引号内...在双引号内),因此即使可以在SQL内部直接引用VBA变量,Access也不内部解释任何此类内容。字符串值。

  • 关于Access SQL LIKE运算符,多字符匹配模式是*而不是%。 Access还可以识别确实遵循ANSI模式ALIKE的运算符%。请参见LIKE operator docsthis thread regarding ALIKE

    • 更全面地说,如果您不希望用户无意间注入导致SQL错误的无效字符,则应转义字符串定界符和LIKE模式匹配字符。以下是逃脱其中几个的示例。对于所有特殊字符,还有更优雅的处理方式,但是代码和技术超出了此答案的范围。
 ...'" & Replace(Replace(searchItem, "*", "[*]"), "'", "''") & "'...
  • 为进行记录,尽管Access SQL不会替代VBA变量,但它将识别并调用公共VBA函数。通常,这样的公共功能必须在常规模块中定义,但是在表单的“记录源”查询的上下文中,有时可以调用表单模块方法。

  • 最后一种技术...可以直接在SQL中引用表单控件的值。这可能非常方便,并减少了额外的代码,但是有一些警告:

    • 当然必须打开表单,否则Access会将引用解释为未知参数并显示提示。如果SQL始终处于相同形式的上下文中,那么这当然不是问题。
    • 当更改了这样的引用控件时,Access有时会自动刷新查询,但并不总是可以保证。自动刷新的“时间”可能不是立即直观的。您可以通过各种表单事件在控件或子表单上调用Refresh方法,以在值更改后强制刷新查询。
    • 请注意,在以下示例中,字符串连接位于VBA字符串内部,因此该连接实际上是在SQL上下文中发生的,而不是像第一个代码片段中那样事先发生。这样做没有问题,只是需要考虑的事情,因为整个答案都围绕正确的字符串解释和连接。
      • 但是,实际上,用户文本中未转义的模式匹配字符也存在同样的问题。而不是通过调用Replace()使SQL文本冗长而丑陋,而是创建一个针对任何文本执行此操作的自定义函数(例如EscapePattern()),然后使用该函数包装控件引用。尽管我没有包括特殊功能的代码,但该示例执行了此操作。此类功能也可以在第一个VBA代码段中使用,以简化SQL文本的构建。
Me.List64.RowSource = & _
  "SELECT Equipment.equipmentID, Equipment.equipmentName," & _
      " Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment" & _
  " WHERE Equipment.equipmentName LIKE ('*' & EscapePattern(Forms![Form Name]![Control Name]) & '*')" & _
  " ORDER BY Equipment.equipmentName;"
  • 总会有更多!您是否在我的示例中看到了VBA行的延续?它使SQL文本在VBA编辑器中更容易查看。

答案 1 :(得分:0)

我怀疑您没有在SQL字符串中正确设置searchItem变量。我对访问字符串串联不太熟悉,但是请尝试将searchItem与SQL字符串分开,然后检查RowSource是否具有您怀疑的值。

Me.List64.RowSource = "SELECT Equipment.equipmentID, Equipment.equipmentName,
Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment 
WHERE Equipment.equipmentName LIKE '%" + searchItem + "%' ORDER BY Equipment.equipmentName;"