WHERE子句中的CASE - 搜索两列或一列

时间:2013-01-13 18:06:09

标签: sql-server

我在名为@name的存储过程中有一个参数。如果此参数的长度为1,则需要搜索单个列(LastName),否则需要搜索两列(FirstName& LastName)。

这是我到目前为止所拥有的 -

 WHERE   
    p.Year = @year
    AND
    (CASE WHEN LEN(@name) = 1 THEN (p.LastName LIKE @name + '%')
          ELSE (p.LastName LIKE @name + '%' OR p.FirstName LIKE @name + '%')
     END)

它给了我这个错误

  

关键字'like'附近的语法不正确。

我如何做到这一点?

2 个答案:

答案 0 :(得分:2)

你可以做到

WHERE  p.Year = @year
        AND (
        /*Always look at this*/
        p.LastName LIKE @name + '%'
       /*Only need to take account of FirstName if len(@name) <> 1 */
       OR ( len(@name) <> 1 AND p.FirstName LIKE @name + '%' )         
        )

但是将其分解为两个单独的查询和IF ... ELSE条件逻辑可能会给你一个更好的计划,而不是在两个案例中尝试一个捕获所有查询。

答案 1 :(得分:2)

如上所述,或许使用IF ... ELSE?

IF len(@name) = 1
  SELECT *
  FROM   test p
  WHERE  p.Year = @year
         AND p.LastName LIKE @name + '%'
ELSE
  SELECT *
  FROM   test p
  WHERE  p.Year = @year
         AND ( p.LastName LIKE @name + '%'
                OR p.FirstName LIKE @name + '%' )