1

我想在 Access 数据库的 FRUIT 列中搜索像 apple 这样的查询字符串术语。 Select * from table_name where FRUIT = "apple"工作正常,当我们正在寻找单个术语时。
但是 FRUIT 列包含多个项,如香蕉、橙子、苹果等(如标签)。所以上面的 SQL 查询在搜索时不起作用。
此外,当用户想要搜索未定义的术语时如何进行 SQL 查询,例如。他可能会尝试苹果或苹果、橙子或葡萄橙苹果等,即他可能会尝试一起搜索一个或多个词。

注意:我也在阅读http://msdn.microsoft.com/en-us/library/ms974570.aspx#scripting05_topic2以解决上述问题。但是,我仍然没有弄清楚如何使用它来获取那些符合搜索条件的记录集。

4

2 回答 2

3

因此,您的表中有一个字段可以包含多个值,例如...

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*"方法不能利用索引。)

于 2013-05-11T11:33:28.037 回答
1

像这样 ..

SELECT * FROM table_name WHERE instr(1,fruit,"apple") > 0
于 2013-05-11T10:40:05.027 回答