我得到了一个应用程序,调用存储过程来获取结果。来自应用程序的输入是这样的:
- Group - nullable
- 名称-可为空。如果我填写Name, ID不需要填写
- ID -可为空。如果填写ID,则无需填写Name
- 段-不可为空。输入可以是ALL段
- Period - not null
想到我的"WHERE"可能性是12种可能性。
- 段时期
- 段、周期、ID
- 段、周期、名称
- 段、周期、组
- 段、周期、组、ID
段、周期、组、名称
ALL Segment, Period
- 所有段,周期,ID
- 所有段、周期、名称
- 所有段、周期、组
- 所有段、周期、组、ID
- 所有段、周期、组、名称
,查询示例如下:
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
是否有办法缩短可能性,这样查询就少写了?
谢谢
非动态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)
答案如下:我写下了一些代码
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。因为如果没有,@where不能被连接,因为@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