因此,您的表中有一个字段可以包含多个值,例如...
banana, orange, apple
...并且您希望能够搜索与这些“标签”中的一个(或多个)匹配的记录。正如 matzone 的回答所示,您可以使用InStr()
或使用 SQLLIKE
运算符进行简单的子字符串匹配,如WHERE Fruit LIKE "*apple*"
.
但是,这也会返回“标记”为“菠萝”的行。为避免该问题,您必须包含分隔符...
WHERE Fruit LIKE "*, apple, *"
...但是,如果您的字段中没有前导和尾随分隔符,即...
, banana, orange, apple,
...那么您将无法在原始示例中找到“香蕉”,除非您这样做...
WHERE ((Fruit LIKE "*, banana, *") OR (Fruit LIKE "banana, *"))
...并且您将无法在列表末尾找到“香蕉”,除非您也这样做...
WHERE ((Fruit LIKE "*, banana, *") OR (Fruit LIKE "banana, *") OR (Fruit LIKE "*, banana"))
(即使您尝试使用前导和尾随分隔符,Access 也会在编辑字段时自动修剪尾随空格,这可能会使事情变得更加复杂。)
现在提出搜索多个“标签”的要求,例如“香蕉”或“苹果”,您的 WHERE 子句变为
WHERE ((Fruit LIKE "*, banana, *") OR (Fruit LIKE "banana, *") OR (Fruit LIKE "*, banana"))
OR ((Fruit LIKE "*, apple, *") OR (Fruit LIKE "apple, *") OR (Fruit LIKE "*, apple"))
当然,您可以在 VBA 代码中构建这种类型的查询,但它很快就会变得笨拙(而且效率很低)。
我的建议:修复你的数据结构。像这样将你的“标签”分解成一个单独的子表......
parentID fruitTag
-------- --------
1 banana
1 orange
1 apple
...然后您可以使用等于条件来搜索标签(通过两个表之间的 INNER JOIN 查询)。您还可以索引 [fruitTag] 字段以加快搜索速度。(InStr()
andLIKE "*tag*"
方法不能利用索引。)