WHERE 子句中的条件过滤
Filtering conditional in WHERE clause
我有一个 table 的 PEN_TIPO
列,该列可以有值 0 和 2,并且在报告中根据过滤器我应用如下条件:
declare @PEN_TIPO int = 0
(A.PEN_TIPO = @PEN_TIPO OR @PEN_TIPO = 0)
但是,它会有一个条件,我不需要过滤这个字段,即我必须从 PEN_TIPO
列中获取 0 和 2。
如何应用此过滤器?
这通常是通过使用 NULL
的类似条件 where 子句来处理的,但是如果您将值默认为 1 或其他值,则您可以编写代码。
在下面的过程中,我们默认参数为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 Kitchen Sink 类型查询。
您要这样做吗?
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
这将带来一切。
听起来您在描述通常称为可选参数的内容。
如果用户输入了一个参数值,他们想以此为基础进行过滤,如果没有,则完全忽略它。
它通常看起来像这样:
DECLARE @PEN_TIPO INT;
(A.PEN_TIPO = @PEN_TIPO OR @PEN_TIPO IS NULL)
OPTION(RECOMPILE);
请注意,我在查询末尾添加了 "OPTION(RECOMPILE)"。
您也需要将此添加到您的查询中,以便优化器可以根据所选参数值创建优化计划。
我有一个 table 的 PEN_TIPO
列,该列可以有值 0 和 2,并且在报告中根据过滤器我应用如下条件:
declare @PEN_TIPO int = 0
(A.PEN_TIPO = @PEN_TIPO OR @PEN_TIPO = 0)
但是,它会有一个条件,我不需要过滤这个字段,即我必须从 PEN_TIPO
列中获取 0 和 2。
如何应用此过滤器?
这通常是通过使用 NULL
的类似条件 where 子句来处理的,但是如果您将值默认为 1 或其他值,则您可以编写代码。
在下面的过程中,我们默认参数为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 Kitchen Sink 类型查询。
您要这样做吗?
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
这将带来一切。
听起来您在描述通常称为可选参数的内容。 如果用户输入了一个参数值,他们想以此为基础进行过滤,如果没有,则完全忽略它。
它通常看起来像这样:
DECLARE @PEN_TIPO INT;
(A.PEN_TIPO = @PEN_TIPO OR @PEN_TIPO IS NULL)
OPTION(RECOMPILE);
请注意,我在查询末尾添加了 "OPTION(RECOMPILE)"。 您也需要将此添加到您的查询中,以便优化器可以根据所选参数值创建优化计划。