根据是否已设置参数查找行值

时间:2017-11-13 05:09:51

标签: sql-server parameters

我有一个包含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行,但我不知道如何修复它。

有关如何实现这一目标的任何建议吗?

1 个答案:

答案 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关于如何最好地应用'可选参数'。