关于Where 中 OR 变量问题
jldzy 2015-02-10 05:43:41 现在有下面几种写法,其中IID是主键,主要是判断变量如果为空就查所有,否则查询相应记录。
下面几种写法,最后一种逻辑读非常少,前面几种没有都是clustered index scan,所有逻辑读非常高,
如果一个存储过程有10个输入条件,为了高效,可以用动态SQL 进行判断 或者 一个一个用IF判断,如果用IF判断,条件组合太多了,
这种判断变量是否为空,怎么才能高效 ?
---logical reads 6996
declare @Id varchar(10)='sss'
select * from [dbo].[xxxx] where [IID]=COALESCE(NULLIF(@Id, ''), IID)
---logical reads 6996
declare @Id varchar(10)='sss'
select * from [dbo].[xxxx] where [IID]=ISNULL(@Id, IID)
---logical reads 6996
declare @Id varchar(10)='sss'
select * from [dbo].[xxxx] where @Id IS NULL or [IID]=@Id
---logical reads 7
declare @Id varchar(10)='sss'
if @Id is not null
select * from [dbo].[xxxx] where [IID]=@Id
else
select * from [dbo].[xxxx]