2012-02-02 97 views
4

我想创建一个SP,它将返回所有Country行,除非提供了一个CountryID作为参数。这是我想象它可能会起作用的方式,但它不喜欢它。有条件的WHERE语句SQL Server

ALTER PROCEDURE [dbo].[usp_return_countries] 
    @CountryID AS INT = 0 
AS 
BEGIN 
     SELECT * 
     FROM Countries 
     WHERE Active = 1 

     IF @CountryID > 0 BEGIN 
      AND @CountryID = CountryID 
     END 

END 

谢谢

附:我认为可能有比根据上述条件重复整个SELECT语句更好的方法。

回答

8

试试这个,这是优雅:)

ALTER PROCEDURE [dbo].[usp_return_countries] 
    @CountryID AS INT = 0 
AS 
BEGIN 

    SELECT * 
    FROM Countries 
    WHERE Active = 1 
    AND (@CountryID = 0 OR @CountryID = CountryID) 

END 
+0

嗯,当然。我看到了这个,但感到困惑,它会匹配表CountryID为0.完美,谢谢 – David 2012-02-02 10:42:18

+0

很高兴为你工作。 – 2012-02-02 10:45:04

4

做这样的:

ALTER PROCEDURE [dbo].[usp_return_countries] 
    @CountryID AS INT = 0 AS BEGIN 

     IF @CountryID > 0 BEGIN 
      SELECT * 
      FROM Countries 
      WHERE Active = 1 
      AND @CountryID = CountryID 
     END 
     ELSE BEGIN 
      SELECT * 
      FROM Countries 
      WHERE Active = 1 
     END 

END 
+0

所以,即使你有一个大规模的选择语句,你将不得不重复整个事情的一个额外的条件? – David 2012-02-02 10:40:54

+0

@大卫这更可读。如果你愿意,你可以选择一个更优雅的方式,像其他答案的状态。但请记住,你可以重复'选择',但只有一个是真的:P – 2012-02-02 10:42:43

+0

我没有声明我想要的东西,而不是重复选择语句。不管怎么说,还是要谢谢你。 – David 2012-02-02 10:59:27

4

很容易在单个WHERE条款包裹起来:

SELECT * 
FROM Countries 
WHERE Active = 1 AND (@CountryID = 0 OR CountryID = @CountryID) 
+0

+1我也得到了同样的答案:) – 2012-02-02 10:40:43

2

喜欢的东西这个?

SELECT * 
     FROM Countries 
     WHERE Active = 1 
AND 
    (CountryID = @CountryID AND @CountryID <> 0) or (@CountryID = 0)