减少存储过程中的“WHERE”可能性

时间:2015-07-25 04:29:59

标签: sql-server sql-server-2012

我有一个调用存储过程来获取结果的应用程序。应用程序的输入是这样的:

  
      
  1. 群组 - 可以入侵
  2.   
  3. 名称 - 可以为空。如果我填写姓名,则无需填写姓名
  4.   
  5. ID - 可以为空。如果我填写身份证,姓名不需要填写
  6.   
  7. 细分 - 不可为空。输入可以是ALL segment
  8.   
  9. 期间 - 不可空置
  10.   

想到我的“可能性”是12种可能性。

  
      
  1. 细分,期间
  2.   
  3. 细分,期间,ID
  4.   
  5. 细分,期间,名称
  6.   
  7. 细分,期间,组
  8.   
  9. 细分,期间,组,ID
  10.   
  11. 细分,期间,群组,名称

  12.   
  13. 所有细分,期间

  14.   
  15. 所有细分,期间,ID
  16.   
  17. 所有细分,期间,名称
  18.   
  19. 所有细分,期间,组
  20.   
  21. 所有细分,期间,组,ID
  22.   
  23. 所有细分,期间,组,名称
  24.   

,示例查询如下:

IF @Group IS NOT NULL AND @ID IS NOT NULL AND @Segment = 'KIDS'
BEGIN
   SELECT * FROM mytable
   WHERE Group = @Group AND ID = @ID AND Segment = @Segment
END

有没有办法缩短可能性,所以查询的编写量较少?

谢谢

2 个答案:

答案 0 :(得分:0)

答案是这样的。我写下了一些代码

DECLARE @query nvarchar(1000), @where nvarchar(1000), @Group varchar(10), @ID varchar(10), @Segment varchar(10)
SET @where = ''
SET @query = 'SELECT * FROM mytable'

IF @Group IS NOT NULL
SET @where = @where + ' AND Group = @_Group '

IF @ID IS NOT NULL
SET @where = @where + ' AND ID = @_ID '

IF @Segment IS NOT NULL
SET @where = @where + ' AND Segment = @_Segment '

IF LEN(@where) > 0
SET @query = @query + ' WHERE ' + RIGHT(@where, LEN(@where)-3)

我已将变量@where设置为空字符串。因为如果我不这样做,@ local就不能合并,因为@where的默认值为null

使用NVARCHAR代替VARCHAR进行查询

将@query称为:

EXECUTE sp_executesql @query, N'@_Group varchar(100), @_ID varchar(100), @_Segment varchar(100)', @_Group = @Group, @_ID = @ID, @_Segment = @Segment

答案 1 :(得分:0)

非动态SQL版本:

SELECT * 
FROM mytable 
WHERE 1 = 1
    AND (Period = @Period)
    AND (@Segment = 'ALL' OR Segment = @Segment)
    AND (@Group IS NULL OR Group = @Group)
    -- Assume one of @Name or @Id is not null
    AND (@Id IS NULL OR Name = @Name)
    AND (@Name IS NULL OR Id = @Id)