为了账号安全,请及时绑定邮箱和手机立即绑定

只想用 in 不用like 因为怕like 太慢!

只想用 in 不用like 因为怕like 太慢!

元芳怎么了 2022-11-19 17:13:41

数据库中新闻表news里有一列关键词:keys
第1条keys列=机械,机械工具,机械厂,机械配件
第2条keys列=机械厂,机械运输
第3条keys列=机械参数,机械厂
第4条keys列=机械工,机厂

这边网页需要显示新闻关键词keys 中有"机械厂"的所有数据,应该怎么写?
select * from news where '机械厂' in (keys)

查看完整描述

3 回答

?
慕勒3428872

TA贡献1577条经验 获得超4个赞

select * from news where keys like '%机械厂%'
呵呵,你这么写的,肯定只能用like,in是没办法做的,而且in的效率也不高。
如果真的想快一点,表内的数据很多那么就分批查询,具体怎么分批,可以考虑分区,如果没有明显字段就hash分区,然后在每个分区中分别查询,这样速度就上来了,而且查询结果页相对出来的快一点。
如果一定要用in,那么你这里只能是根据逗号将keys字段分成几个字段,然后在分别用in来做,不过这样做的话查询的sql不会太短,我估计还没有like快呢。

查看完整回答
反对 回复 2022-11-24
?
一只斗牛犬

TA贡献1520条经验 获得超2个赞

你这样构造in的范围不对。你这样是把in后面处理成一个字符串了。而in后面跟的应该是一个范围。
你可以自己写一个返回数据集的函数来将aa.ddid值处理成in的范围,
类似于:
假设函数:
ft01(nvarchar(1000))
returns
table
tb
(val
int)。
那么,
这样更新里面子查询的in条件:
where
id
in
(select
val
from
ft01(aa.ddid))。
另外,
此解决方法只是从in条件上来说。
如果子查询只有1条记录,in和=是没有区别,如果子查询有多条记录,用=会出错的,所以in是无论只查询有多少条记录都可以使用,而=只有当子查询只有1条记录的时候才能使用。
in和exists理解上其实是差不多,但对数据库而言,in的执行顺序是先执行只查询条件,然后把记录和外查询核对,找符合条件的。
而exists是先执行外查询,再执行子查询,找到外查询记录后和只查询对比符合条件的,如果外查询和子查询的条目数差异很大,那么效率相差很明显的。

查看完整回答
反对 回复 2022-11-24
?
撒科打诨

TA贡献1638条经验 获得超1个赞

select * from news where keys in ('机械厂')
如果是多个
select * from news where keys in ('机械厂','机械工具')

查看完整回答
反对 回复 2022-11-24

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信