我有一个包含2个参数的存储过程:@Name
和@Surname
,必须由外部源设置。
我需要存储过程根据已设置的参数返回值。它应该"忽略" null参数,只考虑设置参数。
SELECT *
FROM ParticipantNames
WHERE -- The if below should go here...
if(@Name iS NOT NULL) - find the row whose [NAME] column LIKE @Name else skip name comparison.
if(@Surname iS NOT NULL) - find the row whose [SURNAME] column LIKE @Surname else skip surname comparison.
if(@Name AND @Surname is NOT NULL) - find the row whose [NAME] column LIKE @Name AND whose [SURNAME] column LIKE @Surname
如果已设置所有参数,则以下情况有效;但如果尚未设置一个参数,则返回0行。
;WITH tempSearch AS
(
SELECT *
FROM ParticipantNames f
WHERE ((f.Name LIKE CASE WHEN @Name IS NULL THEN NULL ELSE @Name END)
AND (f.Surname LIKE CASE WHEN @Surname IS NULL THEN NULL ELSE @Surname END)
...
我知道它因AND条款而返回0行,但我不知道如何修复它。
有关如何实现这一目标的任何建议吗?
答案 0 :(得分:1)
您似乎正在尝试使用'默认'您的查询模式。
这里的问题是,您要将NULL
投射到CASE WHEN
之外,然后导致WHERE Column LIKE NULL
,这将无法正常工作。
你能做的就是将实际的专栏重新载入,如下所示:
SELECT *
FROM ParticipantNames f
WHERE ((f.Name LIKE CASE WHEN @Name IS NULL THEN Name ELSE @Name END)
AND (f.Surname LIKE CASE WHEN @Surname IS NULL THEN Surname ELSE @Surname END)
在默认情况下会导致WHERE Column LIKE Column
,这将起作用。
但请注意,鉴于条件使用谓词,查询优化器上的查询很难。有several similar discussions关于如何最好地应用'可选参数'。