TSQL可选Where子句

时间:2014-07-09 15:46:03

标签: sql sql-server tsql stored-procedures

我有一个查询,默认情况下为我当前的月份提取数据。然后我在我的页面上有一个“过滤器”选项,他们可以输入一些数据来过滤内容并重新运行查询。

我的select语句适用于当月,但我不太确定如何为不包含内容的字段实现逻辑。

示例:如果用户在过滤器选项中填写开始日期和结束日期,则需要使用这些日期与当前月/年的默认日期。

对我来说,棘手的部分是部门和类别。如果过滤器中有值,则需要仅针对这些值category=3 department=5查找提交内容。但是,当过滤器设置中的那些空时,它需要忽略类别和部门并让我记录,无论值是什么。

这是我目前的SP:

 IF (@action = 'filter')
            BEGIN
                SELECT A.[submissionID],
                       A.[subEmpID],
                       A.[nomineeEmpID],
                       CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate,
                       A.[situation],
                       A.[task],
                       A.[action],
                       A.[result],
                       A.[timestamp],
                       A.[statusID],
                       A.[approver],
                       A.[approvalDate],
                       B.[FirstName] + ' ' + B.[LastName] AS nomineeName,
                       B.[ntid] AS nomineeNTID,
                       B.[qid] AS nomineeQID,
                       C.[FirstName] + ' ' + C.[LastName] AS submitName,
                       C.[ntid] AS submitNTID,
                       D.[categoryName]
                FROM   empowermentSubmissions AS A
                       INNER JOIN
                       empTable AS B
                       ON A.[nomineeEmpID] = B.[empID]
                       INNER JOIN
                       empTable AS C
                       ON A.[subEmpID] = C.[empID]
                       INNER JOIN
                       empowermentCategories AS D
                       ON A.[categoryID] = D.[catID]
                WHERE  DATEPART(m, A.[submissionDate]) = MONTH(getdate())
                       AND DATEPART(yyyy, A.[submissionDate]) = YEAR(getdate())
                FOR    XML PATH ('data'), TYPE, ELEMENTS, ROOT ('root');
            END

enter image description here

5 个答案:

答案 0 :(得分:2)

通过查看"如果过滤器中有值,则需要仅在那些值category = 3 department = 5上查找提交。但是,当过滤器设置中的那些空时,它需要忽略类别和部门并让我记录,无论值是什么。"

因此,假设您在名为@Filter的参数中有过滤值,您可以执行以下操作

Where (@Filter is null OR (@Filter is not null and category=3 and department=5))

更新

没有注意到你有两个参数

Where (@category is null or (category = @category))
      and (@department is null or (department= @department))

答案 1 :(得分:1)

如果您需要在sql中硬编码的查询,请尝试:

where (category = @category or @category is null)

并保留所有变量的格式。如果提供了类别,则会过滤提供的值。否则返回所有行,因为参数为null。

如果您可以在代码或sql本身中动态构建sql查询,请使用if语句。

if(@category is not null)
begin
set @sqlQuery = @sqlQuery + 'category = @category'
end

答案 2 :(得分:0)

参数@Category和@Department如何:

WHERE (@Category IS NULL OR @Category = Category)
AND (@Department IS NULL OR @Department = Department)

答案 3 :(得分:0)

我提前定义一个变量(在本例中为@filter),根据查询的频率,在where或join子句中使用模式匹配:

** EDITED ::这绝不是一个以性能为导向的解决方案。**

/* Creating temp table or example query */
IF OBJECT_id('TempDB..#Temp') IS NOT NULL DROP TABLE #Temp

CREATE TABLE #Temp (
    [category] VARCHAR(MAX),
    [description] VARCHAR(MAX))

INSERT INTO #Temp
  SELECT *
  FROM (
  VALUES
  ('Users', 'Joe'),
  ('Users', 'Laura'),
  ('Developers', 'Mike'),
  ('Developers', 'Jane'),
  ('Analysts', 'Jimmy'),
  ('Analysts', 'Monica')) AS vtable
  ([category], [description])

DECLARE @filter VARCHAR(20)
SET @filter = 'Dev'
SET @filter = ISNULL(@filter, '')

SELECT *
FROM #Temp
WHERE category LIKE '%' + @filter + '%'
   OR description LIKE '%' + @filter + '%'

答案 4 :(得分:0)

T-SQL中的可选参数

 declare @ID varchar(4) = '1001';
-- declare @ID varchar(4) = '';
-- declare @ID varchar(4) = null;



 Select * from YourTable t
 Where
 t.ID > 0
 and (IsNull(@ID,'') = '' or t.ID = @ID)