条件WHERE语句 SQL Server

5

我想创建一个存储过程,如果没有提供CountryID参数,则返回所有Country行。这是我想象中的实现方式,但它似乎行不通。

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

谢谢。

P.S. 我认为可能有比根据所说条件简单重复整个 SELECT 语句更好的方法。

4个回答

10

试试这个,它很优雅 :)

 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

啊,是的,当然。我看到了这个,但是被搞糊涂了,以为它会将表CountryID匹配为0。太好了,谢谢。 - David

6

很容易用一个WHERE子句来包含:

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

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

那么,即使您有一个庞大的SELECT语句,您也必须为其他条件重复整个语句吗? - David
@David 这样更易读。如果你愿意,你可以选择其他答案中提到的更优雅的方式。但请记住,你可以重复使用 select,但只有一个会真正执行 :P - aF.
我确实说过我想要的不是重复选择语句。无论如何,谢谢。 - David
1
你的方法可能不够“优雅”,但它可能会产生更好的计划。 - onedaywhen

3
像这样的内容吗?
SELECT *
        FROM Countries
        WHERE Active = 1
AND
    (CountryID = @CountryID AND @CountryID <> 0) or (@CountryID = 0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接