sql server语言 - CASE in WHERE子句-搜索两列或一列



在一个名为@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'附近语法错误。'

我如何做到这一点?

你可以做

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

也许使用IF…如上面所建议的那样?

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 + '%' ) 

最新更新