假设我们已经创建了一个具有可选输入参数的存储过程。
SQL 是否会适当短路以允许以下两个的性能等效?
我问是因为我正在一个接一个地建模自己的proc,而它使用的是后一种方法。知道这样做是出于某种原因还是仅仅因为原作者没有想到这一点会很有用。
select * from
<complex join>
where <various filters>
and (value IS NULL OR myvalue = @value)
或者
if (@value is not null)
begin
select * from
<complex join>
where <various filters>
AND myvalue = @value
end
else
begin
select * from
<complex join>
where <various filters>
end
通常,SQL 是声明式的。也就是说,你说的是“你想要什么”而不是“怎么做”。这样做的一个结果是您无法控制在同一逻辑处理步骤中处理或评估事物的顺序(WHERE 子句或 GROUP BY 子句等是这些步骤)
也就是说,SQL一般不会短路,因为这个概念不适用。
当然,有几种情况(例如 SQL Server 和 CASE),但在您的示例中,您需要第二个选项来保证它。注意 SQL Server 对这种查询进行了优化,但我假设 Sybase 没有