2013-01-13 28 views
1

我在名爲@name的存儲過程中有一個參數。如果此參數的長度爲1,則需要搜索單列(LastName),否則需要搜索兩列(FirstName & LastName)。CASE在WHERE子句中 - 搜索兩列或一列

這裏是我迄今爲止 -

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'.`

關鍵字」

附近有語法錯誤我如何完成這個?

+0

開* *兩種分支,你問'p.LastName LIKE @Name +「%」',你應該提取任何條件 –

+0

是的,我剛剛意識到。謝謝。 – tempid

回答

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

+1爲「打破這一點」。 –

+0

工作很好!非常感謝你。 – tempid

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

謝謝。存儲過程相當龐大(我發佈的只是一個片段),我不想複製它兩次。 – tempid