1

@name というストアド プロシージャにパラメータがあります。このパラメーターの長さが 1 の場合、1 つの列 ( LastName) を検索する必要があり、それ以外の場合は 2 つの列 ( 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 + '%' )         
        )

ただし、これを 2 つの個別のクエリと条件付きロジックに分割するとIF ... ELSE、両方のケースで 1 つのすべてのクエリをキャッチしようとするよりも、より適切な計画が得られる可能性があります。

于 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 に答える