1

我在一个名为@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”附近的语法不正确。`

我该如何做到这一点?

4

2 回答 2

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条件逻辑可能会给您一个更好的计划,而不是尝试针对这两种情况进行一个捕获所有查询。

于 2013-01-13T18:09:05.857 回答
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 + '%' ) 
于 2013-01-13T18:29:32.630 回答