在WHERE子句中过滤条件

时间:2018-11-01 20:21:46

标签: sql-server where

我有一个表的PEN_TIPO列,该列可以具有值0和2,并且在报表中,根据过滤器,我将条件应用如下:

declare @PEN_TIPO int = 0

(A.PEN_TIPO = @PEN_TIPO OR @PEN_TIPO = 0)

但是,它将有一个条件,我不需要过滤此字段,即我必须从PEN_TIPO列中获取0和2。

如何应用此过滤器?

3 个答案:

答案 0 :(得分:0)

通常使用NULL使用类似的条件where子句来处理,但是如果您将值默认设置为1或其他值,则可以编写代码。

在以下过程中,我们将参数默认为NULL。如果您的报告/应用程序未传递任何值,它将保留NULL

  • 如果仍然为null,则返回所有行。
  • 如果传入的值为0或2,则将应用过滤器。
  • 如果传入的值不为0或2,则会引发错误。

这是过程。

create proc myProc (@PEN_TIPO int = NULL)
as

if (@PEN_TIPO IS NOT NULL) or (@PEN_TIPO NOT IN (0,2))
begin
    raiserror('Invalid parameter',16,1)
end

SELECT A.*
FROM SomeTable A
WHERE (A.PEN_TIPO = @PEN_TIPO OR @PEN_TIPO IS NULL)

Aaron Bertrand has an in-depth post on these 厨房水槽类型查询。

答案 1 :(得分:0)

您要这样做吗?

DECLARE @PEN_TIPO INT = NULL 
SELECT *
FROM TableName 
WHERE 
    A.PEN_TIPO = ISNULL(@PEN_TIPO, PEN_TIPO)

@PEN_TIPO = NULL时,A.PEN_TIPO = A.PEN_TIPO将带来一切。

答案 2 :(得分:0)

听起来像您在描述,通常称为可选参数。 如果用户输入了参数值,则他们希望基于该参数值进行过滤,否则请完全忽略该值。

通常看起来像这样:

DECLARE @PEN_TIPO INT;

(A.PEN_TIPO = @PEN_TIPO OR @PEN_TIPO IS NULL)
OPTION(RECOMPILE);

请注意,我在查询末尾添加了“ OPTION(RECOMPILE)”。 您也想将其添加到查询中,以便优化器可以根据所选的参数值创建优化的计划。