2012-02-02 207 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)