Sql server 如果值不为null,则包含在where子句中

Sql server 如果值不为null,则包含在where子句中,sql-server,stored-procedures,sql-server-2012,Sql Server,Stored Procedures,Sql Server 2012,我只是根据输入的参数返回值,如果项目描述为空,我不想在where子句中包含该值 与项目描述一样,所有其他案例都是相同的 ALTER Procedure [dbo].[WP_GetItems] @IsActive bit, @OrderMode bit, @OrderBy varchar(75), @Description varchar(250), @DateFrom datetime, @DateTo

我只是根据输入的参数返回值,如果项目描述为空,我不想在where子句中包含该值

与项目描述一样,所有其他案例都是相同的

ALTER Procedure [dbo].[WP_GetItems] 
    @IsActive     bit,
    @OrderMode    bit,
    @OrderBy      varchar(75),
    @Description  varchar(250),
    @DateFrom     datetime,
    @DateTo       datetime,
    @PriceFrom    float,
    @PriceTo      float
as
Begin 
    Select ItemID, ItemPartNumber, ItemDescription, CreatedDate, InitialPrice from Items where IsActive = @IsActive
    CASE
        WHEN @Description IS NOT NULL THEN AND ItemDescription LIKE '%' + @Description + '%' 
        WHEN @PriceFrom IS NOT NULL THEN AND InitialPrice >= @Price
        WHEN @PriceTo IS NOT NULL THEN AND InitialPrice <= @Price
    END 
    order by
    CASE WHEN @OrderBy='ItemDescription' AND @OrderMode = 0 THEN ItemDescription END ASC,
    CASE WHEN @OrderBy='ItemDescription' AND @OrderMode = 1 THEN ItemDescription END DESC,
    CASE WHEN @OrderBy='ItemPartNumber' AND @OrderMode = 0 THEN ItemPartNumber END ASC,
    CASE WHEN @OrderBy='ItemPartNumber' AND @OrderMode = 1 THEN ItemPartNumber END DESC,
    CASE WHEN @OrderBy='CreatedDate' AND @OrderMode = 0 THEN CreatedDate END ASC,
    CASE WHEN @OrderBy='CreatedDate' AND @OrderMode = 1 THEN CreatedDate END DESC,
    CASE WHEN @OrderBy='InitialPrice' AND @OrderMode = 0 THEN InitialPrice END ASC,
    CASE WHEN @OrderBy='InitialPrice' AND @OrderMode = 1 THEN InitialPrice END DESC
End
ALTER过程[dbo].[WP\u GetItems]
@主动位,
@订单模式位,
@OrderBy varchar(75岁),
@描述varchar(250),
@DateFrom datetime,
@DateToDateTime,
@价格浮动,
@价格浮动
作为
开始
从IsActive=@IsActive的项目中选择ItemID、ItemPartNumber、ItemDescription、CreatedDate、InitialPrice
案例
当@Description不为NULL时,则与ItemDescription类似“%”++@Description++“%”
当@PriceFrom不为空时,则初始价格>=@Price

当@PriceTo不为空时,则和InitialPrice您不能在您的案例中使用AND部分。 试试这个:

WHERE IsActive = @IsActive
AND ItemDescription LIKE CASE WHEN @Description IS NOT NULL THEN '%' + @Description + '%' END
AND InitialPrice >= CASE WHEN @PriceFrom IS NOT NULL THEN @Price ELSE InitialPrice END
AND InitialPrice <= CASE WHEN @PriceTo IS NOT NULL THEN @Price ELSE InitialPrice END
其中IsActive=@IsActive
和ItemDescription类似,当@Description不为NULL时,“%”++@Description++“%”结束
和InitialPrice>=当@PriceFrom不为空时,则@Price ELSE InitialPrice END
初始价格=@PriceFrom)

和(@PriceTo为NULL或InitialPrice您不能在您的案例中使用AND部分。 试试这个:

WHERE IsActive = @IsActive
AND ItemDescription LIKE CASE WHEN @Description IS NOT NULL THEN '%' + @Description + '%' END
AND InitialPrice >= CASE WHEN @PriceFrom IS NOT NULL THEN @Price ELSE InitialPrice END
AND InitialPrice <= CASE WHEN @PriceTo IS NOT NULL THEN @Price ELSE InitialPrice END
其中IsActive=@IsActive
和ItemDescription类似,当@Description不为NULL时,“%”++@Description++“%”结束
和InitialPrice>=当@PriceFrom不为空时,则@Price ELSE InitialPrice END
初始价格=@PriceFrom)

和(@PriceTo为NULL或InitialPrice您不能在您的案例中使用AND部分。 试试这个:

WHERE IsActive = @IsActive
AND ItemDescription LIKE CASE WHEN @Description IS NOT NULL THEN '%' + @Description + '%' END
AND InitialPrice >= CASE WHEN @PriceFrom IS NOT NULL THEN @Price ELSE InitialPrice END
AND InitialPrice <= CASE WHEN @PriceTo IS NOT NULL THEN @Price ELSE InitialPrice END
其中IsActive=@IsActive
和ItemDescription类似,当@Description不为NULL时,“%”++@Description++“%”结束
和InitialPrice>=当@PriceFrom不为空时,则@Price ELSE InitialPrice END
初始价格=@PriceFrom)

和(@PriceTo为NULL或InitialPrice您不能在您的案例中使用AND部分。 试试这个:

WHERE IsActive = @IsActive
AND ItemDescription LIKE CASE WHEN @Description IS NOT NULL THEN '%' + @Description + '%' END
AND InitialPrice >= CASE WHEN @PriceFrom IS NOT NULL THEN @Price ELSE InitialPrice END
AND InitialPrice <= CASE WHEN @PriceTo IS NOT NULL THEN @Price ELSE InitialPrice END
其中IsActive=@IsActive
和ItemDescription类似,当@Description不为NULL时,“%”++@Description++“%”结束
和InitialPrice>=当@PriceFrom不为空时,则@Price ELSE InitialPrice END
初始价格=@PriceFrom)


和(@PriceTo为NULL或InitialPrice,这是因为您不能使用这样的CASE语句。在连接where子句之前,您需要使用动态SQL并计算出您的逻辑。实际上,您根本不需要CASE语句。只需执行
where(@Description为NULL或itemsdescription=@Description)和(@PriceFrom为null或Price>=@PriceFrom)
等。另外,请注意,
case
只能有一个返回值-因此,即使这确实有效(它不能),它不允许您一次搜索多个字段。这是因为您不能使用这样的CASE语句。在连接where子句之前,您需要使用动态SQL并计算出您的逻辑。实际上,您根本不需要CASE语句。只需执行
where(@Description为null或itemsdescription=@Description)和(@PriceFrom为null或Price>=@PriceFrom)
等。另外,请注意,
case
只能有一个返回值-因此,即使这确实有效(它不能),它不允许您一次搜索多个字段。这是因为您不能使用这样的CASE语句。在连接where子句之前,您需要使用动态SQL并计算出您的逻辑。实际上,您根本不需要CASE语句。只需执行
where(@Description为null或itemsdescription=@Description)和(@PriceFrom为null或Price>=@PriceFrom)
等。另外,请注意,
case
只能有一个返回值-因此,即使这确实有效(它不能),它不允许您一次搜索多个字段。这是因为您不能使用这样的CASE语句。在连接where子句之前,您需要使用动态SQL并计算出您的逻辑。实际上,您根本不需要CASE语句。只需执行
where(@Description为null或itemsdescription=@Description)和(@PriceFrom为null或Price>=@PriceFrom)
等。另外,请注意,
case
只能有一个返回值-因此,即使这确实有效(它不能),它将不允许您一次搜索多个字段。这将更改查询的逻辑流,不是吗?他是否要搜索所有三个字段?如果描述不为空,则搜索描述,如果价格不为空,则在where子句中包含价格。这是我的愿望。我已编辑了我的答案,以包含Luaan的建议。两者都是tyles会得到同样的结果。但我相信第二个更好。这会改变查询的逻辑流程,不是吗?他想搜索所有三个吗?如果描述不为空,搜索描述,如果价格不为空,在where子句中包含价格。这是我的愿望。我已经编辑了我的答案,以包含Luaan的建议两种风格都会得到相同的结果。但我相信第二种更好。这会改变查询的逻辑流程,不是吗?他想搜索所有三种风格吗?如果描述不为空,搜索描述,如果价格不为空,在where子句中包含价格。这是我的愿望。我编辑了我的答案以包含Luaan的建议。两种样式都会得到相同的结果。但我确实相信第二种更好。这会改变查询的逻辑流程,不是吗?他想搜索所有三种样式吗?如果描述不为空,搜索描述,如果价格不为空,在where子句中包含价格。这是我的愿望。我编辑了我对我的回答包括Luaan的建议。两种风格会得到相同的结果。但我确实相信第二种更好。