我需要一个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]
答案 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, '') <> '' )