【问题标题】:Having trouble returning rows of table using 'LIKE' operator使用“LIKE”运算符返回表行时遇到问题
【发布时间】:2012-02-04 13:45:29
【问题描述】:

我是数据库编程的新手,在我的数据库中进行搜索时遇到了麻烦。我有一个表,其中有一列名为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...

知道要测试的这些“项目”的数量是可变的,我该怎么做?

【问题讨论】:

  • s/AND/OR/ 例如,颜色不能同时“红色”和“蓝色”。 (除非你想捕捉像“bluered”和“redblue”这样的情况)
  • @wildplasser - 他们将逗号分隔的列表存储在列中。
  • 是的,例如我想确保对象包含一些特征,如“红色”、“方形”和“点”等......
  • 啊哈。您是否考虑过标准化为 1NF?顺便说一句:s/Required_Items/Required_Items/错字?
  • 在列中存储逗号分隔的列表通常是个坏主意。在您的情况下,您可能应该再有两张桌子。一个存储特征,一个存储The_Table中一行所需的特征。

标签: sql search sql-like


【解决方案1】:

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

您是如何将数据导入数据库的?您是从 Word 或 Excel 中复制它并将其粘贴到 SQL 查询生成器中,还是类似的东西?如果您不小心,这可能会导致问题。

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

下面是一个可能发生的例子:

如果“必需物品”字段 = '蝙蝠、球、手套、帽子、头盔、水战' 那么这些都会失败:

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

...where Required_Items like '%Glove%'
         and              ...'%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                                       

这种结构将使处理未知数量的项目变得非常容易。

如果你不能解决这个问题,如果可以的话,发布实际代码和实际数据。

斯科特

【讨论】:

  • 非常感谢。我知道这篇文章很老了,但我仍然想感谢你的回复。我最终按照您的描述更改了结构并添加了关系。
【解决方案2】:

您不能只将“任意数量”的参数放入固定的 SQL 语句中,或者它都是一个字符串,并且您需要对整个字符串进行完全或部分匹配。如果您需要在每个查询中查询不同数量的项目,则需要一个软件中间层,它能够计算搜索词的数量并即时构建适当的 SQL 语句。

【讨论】:

  • 好的,那个软件层可以是PHP?
  • 收到 HTTP 请求的内容。我只知道如何在 Python 中做到这一点。但这都是关于将字符串和变量条件连接到 SQL 语句中。 PHP,当然,为什么不呢?
【解决方案3】:

这个查询看起来不错。 您也可以使用全文索引和全文查询来获取结果。 例如: Select * from table where contains(Columns_list,'item1')

考虑阅读how to get results faster

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多