2013-05-11 48 views
1

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

注:我也在阅读http://msdn.microsoft.com/en-us/library/ms974570.aspx#scripting05_topic2解决上述问题。但是,我还没有弄清楚,如何使用它来获得符合搜索标准的记录集。

回答

3

所以,你必须在你的表中的字段可以包含多个值,比如......

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

+0

谢谢你,举例说明。目前效率和速度并不是我关心的问题,因为它是我自己的试验项目。我正在存储用数组中的空格字符分隔的输入值(用户可能输入两个或更多水果名称)。所以我们可以有一个查询,它可以通过数组值并产生recrodset。我在做什么,循环访问数组值,生成一个recrodset并将其添加到其他搜索项的另一个记录集,然后生成最终记录集。但是这个想法看起来很糟糕。任何建议,以聪明的方式做到这一点。 – msinfo 2013-05-11 11:50:41

+0

@msinfo如果您正在考虑循环访问数组,并且希望将标记保留在单个字段中,那么您可以*:**(1)**使用不能出现在标记本身中的非空格分隔符( ('| tag1 | tag2 |'),然后**(3)**使用“管道”字符'|'是一种流行的选择),**(2)**使用*引导*和*尾部*分隔符循环来构建一个多部分的WHERE子句,例如'WHERE(Fruit LIKE“* | tag1 | *”)OR(Fruit LIKE“* | tag2 | *”)''。 – 2013-05-11 12:02:55

+0

嘿,谢谢我的想法,与您的信息。我现在可以说为什么我的代码笨重和麻烦。再次感谢。 – msinfo 2013-05-11 12:11:00

1

这样的..

SELECT * FROM table_name WHERE instr(1,fruit,"apple") > 0 
+0

对,它的工作。现在我该如何处理多个输入参数,而不是“苹果”,用户可能会搜索“苹果葡萄”。如果它已知参数,我们可以使用OR运算符,但我们需要处理未知参数。 – msinfo 2013-05-11 10:47:10

+1

@msinfo当您搜索“葡萄”时搜索“苹果”或“葡萄柚”被返回时,您没有反对“菠萝”被返回...? – 2013-05-11 10:59:22

+0

@格尔汤普森:是的!我不想那样。因此,如果用户搜索“apple orange”这样的字词,那么只有在FRUIT列中的字词“apple”(不是菠萝)和“orange”作为值的情况下才应该生成这些记录集。 – msinfo 2013-05-11 11:11:11

相关问题