我有一个调用存储过程来获取结果的应用程序。应用程序的输入是这样的:
- 群组 - 可以入侵
- 名称 - 可以为空。如果我填写姓名,则无需填写姓名
- ID - 可以为空。如果我填写身份证,姓名不需要填写
- 细分 - 不可为空。输入可以是ALL segment
- 期间 - 不可空置
醇>
想到我的“可能性”是12种可能性。
- 细分,期间
- 细分,期间,ID
- 细分,期间,名称
- 细分,期间,组
- 细分,期间,组,ID
细分,期间,群组,名称
所有细分,期间
- 所有细分,期间,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
有没有办法缩短可能性,所以查询的编写量较少?
谢谢
答案 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)