筛选WHERE子句中的条件



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

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

然而,它将有一个条件,即我不需要筛选此字段,即我必须从PEN_TIPO列中获得0和2。

如何应用此筛选器?

听起来像是在描述一个通常被称为可选参数的参数。如果用户输入了一个参数值,他们希望以此为基础进行筛选,如果没有,则完全忽略它。

它通常看起来像这样:

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

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

你想这么做吗?

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这会带来一切。

这通常使用类似的条件where子句使用NULL来处理,但如果默认值为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有一篇关于厨房水槽类型查询的深入文章。

最新更新