Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server的条件WHERE语句_Sql_Sql Server 2008_Tsql - Fatal编程技术网

SQL Server的条件WHERE语句

SQL Server的条件WHERE语句,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我想创建一个SP,它将返回所有Country行,除非CountryID作为参数提供。这是我想象中的可能的工作方式,但它不喜欢 ALTER PROCEDURE [dbo].[usp_return_countries] @CountryID AS INT = 0 AS BEGIN SELECT * FROM Countries WHERE Active = 1 IF @CountryID > 0 BEGIN

我想创建一个SP,它将返回所有
Country
行,除非
CountryID
作为参数提供。这是我想象中的可能的工作方式,但它不喜欢

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语句。

这样做:

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

很容易用一个
WHERE
子句来概括:

SELECT * 
FROM Countries 
WHERE Active = 1 AND (@CountryID = 0 OR CountryID = @CountryID)
试试这个,它很优雅:)

像这样的

SELECT *
        FROM Countries
        WHERE Active = 1
AND
    (CountryID = @CountryID AND @CountryID <> 0) or (@CountryID = 0)
选择*
来自各国
其中活动=1
及
(CountryID=@CountryID和@CountryID 0)或(@CountryID=0)

因此,即使您有一个庞大的select语句,您也必须为附加条件重复整个过程?@David这更具可读性。如果你愿意,你可以选择一种更优雅的方式,就像其他答案一样。但是请记住,您可以重复
select
,但只有一个是真的:PI没有声明我想要的东西,而不是重复select语句。无论如何,谢谢你。你的方法可能不“优雅”,但它确实是。啊,是的,当然。我看到了这一点,但感到困惑的是,它将与表CountryID匹配为0。太好了,谢谢
SELECT *
        FROM Countries
        WHERE Active = 1
AND
    (CountryID = @CountryID AND @CountryID <> 0) or (@CountryID = 0)