条件WHERE子句

Pat*_*tec 0 sql sql-server sql-server-2008

我需要WHERESQL 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]
Run Code Online (Sandbox Code Playgroud)

Chr*_*ain 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 <>''))
Run Code Online (Sandbox Code Playgroud)

但是,在子句中需要注意这种情况,因为它确实会搞砸执行计划优化.有关原因的更多信息,请参阅@ Iain的答案.