如果是限定范围的,可以用Between,这样要快很多, WHERE BETWEEN 1 AND 4000如果范围不固定,要看有什么规率,没规率的话,无解。
变通一下: declare @str varchar(8000) set @str = '1,2,3,4,5' /*将in后面的表达式列表转换成一个字符串*/ select * from qu_question where charindex(',' + cast(qu_id as varchar(10)) + ',',',' + @str + ',') > 0
其实in实现的就是or的功能, select * from tablename where id in (2,3) 就相当于 select * from tablename where id=2 or id=3 所以你就可以写成or的形式,如果不怕麻烦的话。这是什么需求,in和or都会引起全表扫描。效率可不好噢。
----创建测试表 declare @t table(id int identity) declare @i int set @i = 1 ----向表中添加19行 while @i < 20 begin insert @t default values set @i = @i + 1 end select * from @t ----将这19行的ID连接成charindex需要的字符串 declare @str varchar(8000) set @str = '' select @str =@str + ',' + cast(id as varchar(10)) from @t set @str = stuff(@str,1,1,'') print @str /*'1,2,3,4,....,19'*/ ----测试 select * from @t where charindex(',' + cast(id as varchar(10)) + ',',',' + @str + ',') > 0
declare @str varchar(8000)
set @str = '1,2,3,4,5' /*将in后面的表达式列表转换成一个字符串*/
select * from qu_question
where charindex(',' + cast(qu_id as varchar(10)) + ',',',' + @str + ',') > 0
select * from tablename where id in (2,3)
就相当于
select * from tablename where id=2 or id=3
所以你就可以写成or的形式,如果不怕麻烦的话。这是什么需求,in和or都会引起全表扫描。效率可不好噢。
declare @t table(id int identity)
declare @i int
set @i = 1
----向表中添加19行
while @i < 20
begin
insert @t default values
set @i = @i + 1
end
select * from @t
----将这19行的ID连接成charindex需要的字符串
declare @str varchar(8000)
set @str = ''
select @str =@str + ',' + cast(id as varchar(10)) from @t
set @str = stuff(@str,1,1,'')
print @str /*'1,2,3,4,....,19'*/
----测试
select * from @t where charindex(',' + cast(id as varchar(10)) + ',',',' + @str + ',') > 0