所以,你必须在你的表中的字段可以包含多个值,比如......
banana, orange, apple
...你想成为能够搜索匹配这些“标签”中的一个(或多个)的记录。如matzone的答案所示,您可以使用InStr()
或使用SQL的LIKE
运算符进行简单的子字符串匹配,如WHERE Fruit LIKE "*apple*"
中所述。
但是,这也会将“标记”为“菠萝”的行返回。为了避免这个问题,你必须包括分隔符...
WHERE Fruit LIKE "*, apple, *"
...但是,如果你没有领先,并在你的领域尾随分隔符,即...
, banana, orange, apple,
...那么你将无法在原来的例子,除非你找到“香蕉” ......
WHERE ((Fruit LIKE "*, banana, *") OR (Fruit LIKE "banana, *"))
...你赢了” T为能找到“香蕉”在年底名单,除非你也做的 ...
WHERE ((Fruit LIKE "*, banana, *") OR (Fruit LIKE "banana, *") OR (Fruit LIKE "*, banana"))
(即使你试图用开头和结尾的分隔符,访问具有自动修整尾随空白习惯从田地时,他们进行编辑,这可能问题更加复杂。)
现在扔在需要搜索多个“标签”,比如,“香蕉”或“苹果”,你的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()
和LIKE "*tag*"
方法不能利用索引。)
谢谢你,举例说明。目前效率和速度并不是我关心的问题,因为它是我自己的试验项目。我正在存储用数组中的空格字符分隔的输入值(用户可能输入两个或更多水果名称)。所以我们可以有一个查询,它可以通过数组值并产生recrodset。我在做什么,循环访问数组值,生成一个recrodset并将其添加到其他搜索项的另一个记录集,然后生成最终记录集。但是这个想法看起来很糟糕。任何建议,以聪明的方式做到这一点。 – msinfo 2013-05-11 11:50:41
@msinfo如果您正在考虑循环访问数组,并且希望将标记保留在单个字段中,那么您可以*:**(1)**使用不能出现在标记本身中的非空格分隔符( ('| tag1 | tag2 |'),然后**(3)**使用“管道”字符'|'是一种流行的选择),**(2)**使用*引导*和*尾部*分隔符循环来构建一个多部分的WHERE子句,例如'WHERE(Fruit LIKE“* | tag1 | *”)OR(Fruit LIKE“* | tag2 | *”)''。 – 2013-05-11 12:02:55
嘿,谢谢我的想法,与您的信息。我现在可以说为什么我的代码笨重和麻烦。再次感谢。 – msinfo 2013-05-11 12:11:00