论坛首页 Java企业应用论坛

like 模糊查询

浏览 14418 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (15) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-04-28  
topcode 写道
qingfengjushi1 写道
这样设计库表似乎不太合理, 第一范式都不满足。


难道所有的东西都一定要满足三范式吗.
特殊情况下需要取舍的吧


是,但这种情况下,确实有必要怀疑表设计是否合理了。
0 请登录后投票
   发表时间:2010-04-28  
只能当练习用!!一般开发很难遇到吧!!在说表设计不合理吧!!
0 请登录后投票
   发表时间:2010-04-28  
数据库记录太多,一把就死了!
0 请登录后投票
   发表时间:2010-04-28  
xxjglobal 写道
不错,经测试 在sqlserver中没有问题
在oracle中应该为
select * from Table where ','||columA||',' like '%,111,%'

mysql 中也是这样。
0 请登录后投票
   发表时间:2010-04-28  
select * from auction where ',' || auction_name || ',' like '%,111,%';
0 请登录后投票
   发表时间:2010-04-28  
全表扫描,索引直接废了……谁还敢用?
0 请登录后投票
   发表时间:2010-04-28  
ysen 写道
myy 写道
不错,考虑得很周到,不过这样效率比较低,记录数太多会很慢。

有什么更好的解决办法没啊?


可以考虑在保存时前后各增加一个逗号(,),模糊查询语句修改为
select * from Table where columA like '%,111,%'。
0 请登录后投票
   发表时间:2010-04-28  
二点,
1,低级问题,懂sql的谁都会注意
2,这问题常见,啥全表扫描啊,难道就这一字段过滤啊,
0 请登录后投票
   发表时间:2010-04-29  
妙!这个问题以前还没想过
0 请登录后投票
   发表时间:2010-04-29  
ysen 写道

 sql 模糊查询

 

逗号,在sql中like中不需要转义,但是如果
在sql中的某个字段值用“,”分隔数据,
需要获取数据的时候直接把“,”拆分成数据,获得一个数据的list。

例如:需要查询某字段是否包含一个值,
111是否存在于1111,2111,1112,1121,1113这个字段中 。
因为根据“,”逗号分开,要求的答案是:不在字段中。

用传统的like '%111%',显然不合适,这样虽然111不存在但是依然能查到该条记录。
所以应该用以下语句实现:
select * from Table where ','+columA+',' like '%,111,%'。
实际就是把字段填上一个逗号然后在比较。如果你的字段是用别的分隔符,同理可得。

like本身效率就比较低,应该尽量避免查询条件使用like;对于like ‘%...%’(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低;另外,由于匹配算法的关系,模糊查询的字段长度越大,模糊查询效率越低。

解决办法:首先尽量避免模糊查询,如果因为业务需要一定要使用模糊查询,则至少保证不要使用全模糊查询,对于右模糊查询,即like ‘…%’,是会使用索引的;左模糊like

‘%...’无法直接使用索引,但可以利用reverse + function index 的形式,变化成 like ‘…%’;全模糊是无法优化的,一定要的话考虑用搜索引擎。出于降低数据库服务器的负载考虑,尽可能地减少数据库模糊查询。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics