使用'LIKE'运算符返回表行时遇到问题

时间:2012-02-04 13:45:30

标签: sql search sql-like

我是数据库编程的新手,我在数据库中进行搜索时遇到了麻烦。我有一个名为Required_Items的列的表,它只是一个由';'分隔的必需项的列表。查询时,我无法让服务器返回行:

'SELECT * FROM The_Table WHERE Required_Items LIKE '%item1%' '

似乎数据库无法在列中找到该项。问题是我希望能够返回包含所有项目的行。我会尝试类似的东西:

'SELECT * 
 FROM The_Table 
 WHERE Requiered_Items LIKE '%item1%' AND 
       Requiered_Items LIKE '%item2%' AND 
       Requiered_Items LIKE '%item3%' AND//etc...

我怎么知道会有可变数量的这些“项目”进行测试?

3 个答案:

答案 0 :(得分:2)

当我遇到这样的问题时,它总是证明我的比较字符串根本不匹配。 (这并不是说他们看起来不匹配。)常见的原因是拼写错误,大写与小写问题,字符(特别是空格)不是它们看起来的样子。你在任何“喜欢”的比较中都有空格吗?

您是如何将数据导入数据库的?您是从Word还是Excel复制它并将其粘贴到SQL查询构建器中,还是某种性质的?如果你不小心,这可能会导致问题。

当然,您知道所有“喜欢”的比较必须匹配才能获得数据......?

以下是可能发生的事情的一个例子:

如果'必需物品'字段='蝙蝠,球,手套,帽子,头盔,水战' 然后这些都会失败:

...where Required_Items like '%Bat%'
         and              ...'%Water Bottle%'

...where Required_Items like '%Glove%'
         and              ...'%Water Bottle%'

(因为'Water Bottle'拼写错误在数据库中)

您可以通过在where子句中一次使用一个项目来解决此类问题,直到找到失败的项目为止。

关于可变数量的项目,使用数据设置方式(一个csv字段中的所有项目),如果使用动态sql,则代码可能最干净。这就是你在字符串变量中构建查询并执行变量的地方。搜索“动态SQL”。

所有这些,在关系数据库中存储这种数据的首选方法是在实体之间创建可维护的关系。如果您将项目分解为如下结构,那么您的数据会更友好:

__The_Table_______      __Thing_Items____      __Items_______________
Thing_ID  Thing         Thing_ID  Item_ID      Item_ID  Item               
--------  --------      --------  -------      -------  --------------     
T1        Baseball      T1        i1           i1      Ball               
T2        Football      T1        i2           i2      Bat                
T3        Fishing       T1        i5           i3      Shoulder Pads      
                        T2        i1           i4      Worms              
                        T2        i3           i5      Water Bottle       
                        T2        i5                                       
                        T3        i4                                       
                        T3        i5                                       

这种结构可以很容易地处理未知数量的物品。

如果无法解决此问题,请尽可能发布实际代码和实际数据。

斯科特

答案 1 :(得分:0)

此查询看起来正确。 您也可以使用全文索引和全文查询来获得结果。  例如: 从包含(Columns_list,' item1 ')

的表中选择*

考虑阅读how to get results faster

答案 2 :(得分:0)

您不能只将“任意数量”的参数抛出到固定的SQL语句中,或者它只是一个字符串,并且您需要对整个字符串进行精确或部分匹配。如果您需要查询每个查询的不同数量的项目,您将需要一个软件中间层,它能够计算搜索项的数量,并在运行中构建相应的SQL语句。