条件WHERE子句

时间:2012-06-27 17:22:11

标签: sql sql-server sql-server-2008

我需要一个SQL Server中条件WHERE子句的解决方案。我无法弄清楚如何根据声明的变量将函数添加到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]

3 个答案:

答案 0 :(得分: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的答案。

答案 1 :(得分:3)

我的建议是将它分成三个单独的程序 - 一个用于完全查询,只使用第一个子句,另一个用于完全查询,只使用第二个子句,第三个作为“主”,它调用任何一个取决于条件。过去一直存在问题,SQL Server只编译条件子句的第一个使用分支(我不确定2008年是否就是这种情况),因此使用单独的存储过程可以保护您免受此类攻击,并且这是一种简单的方法组织事情。

答案 2 :(得分:0)

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