有没有办法只对 WHERE 子句中的变量进行一次空检查?

Mys*_*gue 12 null sql-server

我对一个看起来像这样的大表有一个查询:

declare @myIdParam int = 1

select * 
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)
Run Code Online (Sandbox Code Playgroud)

where子句中有几个类似这样的条件,也有很多连接,但这是一个总结。

实际上,如果@myIdParam 为空,我们不希望使用此参数限制结果。

我不是数据库专家,但从我的测试来看,似乎对每条记录都进行了 NULL 检查,并且没有以任何方式优化。

如果我删除空检查并假设参数不为空,则查询会立即返回。否则,最多需要十秒钟。

有没有办法优化它,以便在运行时只进行一次检查?

Mys*_*gue 8

一种方法是使用动态 SQL,使用空检查来可选地添加 where 子句的那部分。

declare @myIdParam int = 1
declare @vc_dynamicsql varchar(max)

set @vc_dynamicsql = 'select * from myTable where 1=1'

if @myIdParam is not null
    set @vc_dynamicsql = @vc_dynamicsql + ' and  myTable.Id = @myIdParam'

EXECUTE sp_executesql @vc_dynamicsql
Run Code Online (Sandbox Code Playgroud)

  • 我真的不想这样做,但这是一个解决方案。我希望有人带着更好的人来。 (2认同)