Oracle中使用多个like查询的问题

表table的数据量非常大,其中有id和context两个字段,context是一串很长的字符串,长度为varchar2(4000),现在根据context的关键字“ap... 表table的数据量非常大,其中有id和context两个字段,context是一串很长的字符串,长度为varchar2(4000),现在根据context的关键字“apple”、“banana”来查询对应的id,但是又不能包含关键字“strawberry”。
问题一:如下两个SQL为什么效率相差很多?
SQL1:
SELECT b.id FROM table b WHERE (b.context LIKE '%apple%' OR b.context LIKE '%banana%') AND b.context NOT LIKE 'strawberry';

SQL2:
SELECT b.id FROM table b WHERE b.context LIKE '%apple%' OR b.context LIKE '%banana%' AND b.context NOT LIKE 'strawberry';

问题二:类似这种情形的,需要多个like查询的SQL有没有什么好的写法或者是需要注意的地方?

新人上路,恳请前辈大牛们不吝赐教,谢谢!
展开
 我来答
圆圆的大白
2018-03-06
知道答主
回答量:3
采纳率:100%
帮助的人:2571
展开全部
--建议用这种写法,数据量大又需要模糊查询的时候,用instr函数效率比like要高很多

select b.id from table b

where (instr(b.context,'apple')>=1 or instr(b.context,'banana')>=1)

and instr(b.context,'strawberry')=0
;
匿名用户
2018-03-06
展开全部
1、根据题意,SQL2应该不合符要求,另外SQL1和SQL2都没在strawberry加%。
SQL2: where 条件等价于:(b.context LIKE '%apple%') OR ( b.context LIKE '%banana%' AND b.context NOT LIKE 'strawberry')
语句效率应该相差不多,性能都不好,因为都要全表扫描且字符串都要从头到尾匹配。如果性能相差大,主要是你的语句最后1个LIKE 没用%,不要从头到尾匹配,这样可能SQL1更快。
2、类似对同一字段多次LIKE ,特别是比较耗时的,注意下数据的特点,尽量一次就过滤掉数据,如果是AND关系,数据不符合多的尽量放前面,如果是OR关系,数据符合多的尽量放前面。LIKE字符串尽量不要以%开头
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
micro0369
推荐于2016-07-01 · TA获得超过1.2万个赞
知道大有可为答主
回答量:9250
采纳率:85%
帮助的人:3946万
展开全部
sql2 的逻辑是错误的:
当数据中包含 apple,并且可能包含 strawberry也被选取出来了。

没有好的写法,涉及有like %xxx 的无法使用索引,所以效率无法提升。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式