有条件地 OR vs CASE vs IF

use*_*567 1 oracle sql-server

可以说,我有一个查询,

SELECT * FROM MyTable WHERE MyParam = 0 OR MyColumn = MyParam
Run Code Online (Sandbox Code Playgroud)

这里 MyParam 是参数和可选的。因此,它只检查MyColumn = MyParamMyParam 是否不为 0。但是我们的 DBA 说 OR 会使其变慢,而 db 会受到影响。另一种选择是,

IF MyParam = 0 
SELECT * FROM MyTable WHERE MyColumn = MyParam
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于我们有很多可选参数。所以,我们的查询变得非常非常大。另一种选择是 CASE。

所以你们的建议是什么。我在谈论一般是 Oracle 还是 SQL Server。

Sql*_*Zim 5

在 sql 服务器中:

一种选择是动态 sql,另一种是option (recompile).

使用option (recompile)

select * from MyTable where MyParam = 0 or MyColumn = MyParam option (recompile);
Run Code Online (Sandbox Code Playgroud)

动态sql示例:

declare @sql nvarchar(max);

if nullif(@MyParam,0) is not null
  begin;
  set @sql = 'select * from MyTable where MyColumn=@MyParam;'
  exec sp_exeuctesql @sql, '@MyParam int', @MyParam;
  end;
else 
  begin;
  set @sql = 'select * from MyTable;'
  exec sp_exeuctesql @sql;
  end;
Run Code Online (Sandbox Code Playgroud)

参考: