0

WHERE我需要SQL Server 中条件子句的解决方案。我不知道如何WHERE根据声明的变量将函数添加到子句中。我将用所需的逻辑括起来条件部分

DECLARE @distance bigint
DECLARE @photosneeded bigint

SET @distance * 50

SELECT * FROM users u
WHERE
  [IF @distance > 0 THEN distance_function(lat1,lon1,lat2,lon2)<=@distance END]
  AND
  [IF @photosneeded>0 THEN u.photo IS NOT NULL AND u.photo <>'' END]
4

3 回答 3

5

可以使用普通的 WHERE 子句来完成:

SELECT * FROM users u
WHERE
(@distance <= 0 or (distance_function(lat1,lon1,lat2,lon2)<=@distance))
AND
(@photosneeded <= 0 or (u.photo IS NOT NULL AND u.photo <>''))

但是,您需要小心子句中的这种条件,因为它真的会搞砸执行计划优化。有关原因的更多信息,请参阅@Iain 的答案。

于 2012-06-27T17:26:53.110 回答
3

我的建议是将其分为三个单独的过程 - 一个用于仅使用第一个子句的完整查询,另一个用于仅使用第二个子句的完整查询,第三个作为“主”,根据条件调用其中一个。过去,SQL Server 只编译条件子句的第一个使用的分支存在问题(我不确定 2008 年是否是这种情况),因此使用单独的存储过程可以保护您免受这种情况的影响,这是一种简单的方法组织事情。

于 2012-06-27T17:27:08.987 回答
0
SELECT * FROM users u
WHERE
 ( @distance <= 0 or distance_function(lat1,lon1,lat2,lon2)<=@distance )
 and
 ( @photosneeded <= 0 or isnull(u.photo, '') <> '' )
于 2012-06-27T17:30:10.707 回答