9

我想在 SQL Server 中创建一个过程,它将选择并连接两个表。参数@company、@from 和@to 始终设置,但@serie_type 可以为NULL。如果@serie_type 不为NULL,我只想包含指定的类型,简单AND S.Type = @serie_type,但如果@serie_type 为NULL,我想包含所有类型,简单,只是不包含AND 语句。我的问题是我不知道是否会设置@serie_type,因此我希望有这样的东西:

/* pseudocode */
??? = AND (IF @serie_type IS NOT NULL S.Type = @serie_type)

这是一个简化版本的程序:

CREATE PROCEDURE Report_CompanySerie
    @company    INT,
    @serie_type INT,
    @from       DATE,
    @to         DATE
AS
BEGIN
    SELECT
        *
    FROM Company C
        JOIN Series S ON S.Company_FK = C.Id
    WHERE C.Id = @company 
        AND S.Created >= @from
        AND S.Created <= @to
/* HERE IS MY PROBLEM */        
        AND ???
END
GO

不想复制选择,因为真正的选择比这个大得多。

4

4 回答 4

15

常见的做法是:

WHERE 
C.Id = @company          
AND S.Created >= @from         
AND S.Created <= @to 
AND  (@serie_type IS NULL OR S.Type = @serie_type)
于 2011-09-22T11:26:58.243 回答
11

无需这样做 ,因为 SQL Server有AND (@serie_type IS NULL OR S.Type = @serie_type)一个内置函数可以为您执行此逻辑。

尝试这个:

   .
   .
   AND  S.Type = isnull( @serie_type, S.Type)

这返回

如果@serie_type 为空或@serie_type = S.Type 的结果如果@serie_type 不为空,则为true。

MSDN

IsNull 用指定的替换值替换 NULL。

ISNULL ( check_expression , replacement_value )

check_expression的值如果不为NULL则返回;否则,如果类型不同,则在隐式转换为 check_expression 的类型后返回 replacement_value。

于 2011-09-22T11:27:45.957 回答
0

您还可以在 where 子句中使用 case 语句

其中 e.ZoneId = case when @zoneid=0 then e.zoneid else @zoneid end

于 2013-02-13T06:50:48.467 回答
0

非常干净的方法将被定义@serie_type0。看看下面:

CREATE PROCEDURE Report_CompanySerie
    @company    INT,
    @serie_type INT = 0,
    @from       DATE,
    @to         DATE
AS
BEGIN
    SELECT
        *
    FROM Company C
        JOIN Series S ON S.Company_FK = C.Id
    WHERE C.Id = @company 
        AND S.Created >= @from
        AND S.Created <= @to
/* HERE IS MY PROBLEM */        
        AND (@serie_type = 0 OR S.SerieType = @serie_type)
    END
GO
于 2013-12-31T02:46:46.730 回答