2012-02-21 74 views
0

当尝试根据是否传递某个值返回适当的结果时,我遇到了使用CASE时遇到的问题。在SQL Server 2008中使用CASE

例如我想运行一个查询,如果郊区传递

WHEN @suburb <> '' THEN 
@suburb 
END 
= [Suburb] 
AND 
[City] = @city 

但是怎么办,这样,当没有郊区传递它仅使用这个城市我只运行查询?

我应该写下如下的查询吗?

WHERE 
(
    [Suburb] = @suburb 
    AND 
    [City] = @city 
) 
OR 
(
    [City] = @city 
) 
+0

我绝对不会写在第二种形式。 – 2012-02-21 21:42:55

+0

@Aaron Bertrand - 为什么不推荐在第二个写? – PeanutsMonkey 2012-02-21 22:26:26

+0

因为为什么重复两次“城市= @城市”条款? – 2012-02-21 22:35:35

回答

1

你并不真的需要CASE

WHERE (suburb = @suburb OR @suburb = '' OR @suburb IS NULL) AND city = @city 
+0

这就像一个魅力。一个问题,虽然我是一个SQL新手。我猜测OR语句只有在第一个条件失败的情况下才能满足,例如如果'suburb = @ suburb'没有值,那么它会继续处理'@suburb ='''。泰勒是对的吗? – PeanutsMonkey 2012-02-21 21:32:52

+1

不,SQL不会短路。所有表达式都被评估。 – 2012-02-21 21:36:26

+0

http://weblogs.sqlteam.com/jeffs/archive/2003/11/14/513.aspx上的文章似乎暗示了它的作用,除非我误解了。如果评估所有条件,是否可以满足所有这些条件? – PeanutsMonkey 2012-02-21 21:48:07

1

由于您使用SQL Server 2008中,你要在这里使用的OPTION (RECOMPILE)提示,以避免缓存不适当的计划。有关更多详细信息,请参阅Catch-all queries

... 
WHERE ((@suburb = '') OR (@suburb <> '' AND [Suburb] = @suburb)) 
    AND [City] = @city 
OPTION (RECOMPILE) 
+0

+1用于处理参数嗅探的风险 – 2012-02-21 21:23:34

1

有几种可供选择的方式来实现,你可以尝试其中之一..

WHERE [City] = @city 
AND ([Suburb] = @suburb OR '' = '') 
0
SELECT FirstName, LastName, TelephoneNumber, "When to Contact" = 
CASE 
     WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time' 
     ELSE TelephoneSpecialInstructions 
END 

FROM Person.vAdditionalContactInfo;