select keyword from test where charindex(keyword,'a,b,c,d,e,f,g')>0
兄弟,你这种方法应该不是楼主想要的结果,勿喷。我上图给你看。
图中,我第一个Sql语句是查询这张表所有数据(这张表总共有59条记录,1-9条的KeyWorld是a。10-19的KeyWorld是a,b。20-29的KeyWorld是a,b,c。依次类推。50-59的KeyWorld是a,b,c,d,e,f)。
当我查询条件为只查询 a,f 满足这两个值的查询条件,如果按照楼主期望的那种结果,那么应该是可以将这59条记录全部查询出来(因为这59条记录都有a)。但是用兄弟你写的这个查询语句,就只能查询出9条记录,那就是 KeyWorld为a 的那9条数据。不过你写的Sql语句有其它的使用价值,顶一下。
@izhangxu: 在大数据量下,charindex 效率没有contains 高,我试过了
在查询里用函数效率都高不到哪儿去,数据库就不是设计用了做逐行处理的。数据量越大,Join 处理和函数导致的逐行处理就越慢。特别是还会设索引失效。
另外%前置的like同样会使索引失效。效率一样很低
函数导致的逐行处理就越慢。特别是还会设索引失效。不是Join
楼主说的可是多条件模糊查询?
不是多条件模糊查询
例如:我在前台输入a,b,c,d 四个关键词。
数据库(test 表)中有字段keyword
id keyword
1 a,b,c,d,e,f,g
2 b
3 c
4 d
5 e
6 g
符合条件的有前4条记录数据,找出来,并且表中有30w 的数据。
create proc sp_QueryDemo @a varchar(20), @b varchar(20) --其他字段定义 as begin declare @sql varchar(5000) set @sql='select 字段列表 from tb_a where 1=1 ' if(@a != null) @sql + ' and a like %'+@a+'%' if(@b != null) @sql + ' and b like %'+@b+'%' --其他字段拼接 exec (@sql ) --假如有参数,后面添加参数 end
每次前台输入的关键字是固定的还是不固定的
把输入的参数格式化后放入表变量或临时表,然后和主表Join。怎么Join不用说了把?
如:
输入:a,b,c,d
格式化结果:
a
b
c
c
a,b
a,c
.........
写个笛卡尔乘积函数解决格式化。
临时表中格式化数据.格式化结果=test(表).keyword ?
id keyword
1 a,b,c,d,e,f,g
搜索不出上条数据,格式后的结果数据中包含e,f,g。
一个很out 的方法,效率估计不好,将a,b,c,d 关键词 拆分成数组,拼接查询语句,例如 keyword like %'a' % or keyword like %'b' or keyword like %'c' or keyword like %'d' 这样效率极其慢,换成全文索引Contains(keyword,'"a*"')....效率高很多,但是感觉还是不最好的处理方式。
我看这题目不只是考匹配,还有一句“(表中大概有30万数据)”,意思是说大数据量的操作能够短时间内完成。不然就成数据库题目了,还要C#干什么呢
不要在这样找笔试题了,一次就这么几个,还没过瘾就没有了,去安装个《笔试宝典》收录了网上90%的笔试题http://bishi.jisupeixun.com