2012-10-09 160 views
2

我想在案例中的tsql中做一個select語句。首先是基於SearchField的內容。接下來我需要基於SearchOper來完成它。案例中的TSql案例

declare @searchField varchar(50) 
    declare @searchString varchar(50) 
    declare @searchOper varchar(50) 

    case @searchField 
    when 'CompanyName' then 
     case @searchOper 
      when 'eq' then 
      select * from tbl1 where CompanyName = @searchString 
     when 'ne' then 
      select * from tbl1 where CompanyName <> @searchString 
     end 
    when 'StoreNum' then 
     case @searchOper 
      when 'eq' then 
      select * from tbl1 where StoreNum = @searchString 
      when 'ne' then 
      select * from tbl1 where StoreNum <> @searchString 
     end 
    end 

注意我想要做的是在case語句中做一個選擇。

我收到一條消息,指出關鍵字'case'附近的語法不正確。

回答

4

根據你的榜樣,你可能想IF語句中使用(這裏是ELSE的例子,但你可以使用if和else if多次太):

declare @searchField varchar(50) 
declare @searchString varchar(50) 
declare @searchOper varchar(50) 

IF @searchField='CompanyName' 
BEGIN 
    IF @searchOper='eq' 
    BEGIN 
     select * from tbl1 where CompanyName = @searchString 
    END 
    ELSE 
    BEGIN 
     select * from tbl1 where CompanyName <> @searchString 
    END 
END 
ELSE 
BEGIN 
    IF @searchOper='eq' 
    BEGIN 
     select * from tbl1 where StoreNum = @searchString 
    END 
    ELSE 
     select * from tbl1 where StoreNum <> @searchString 
    END 
END 

情況非常相似,而是用於內聯語句(即SELECT CASE 1 = 1 THEN'a'ELSE'b'END)。

+0

謝謝。你確定沒有辦法使用CASE。我也考慮過IF,但CASE會更優雅 –

+0

當跨越條件使用同一張表時(比如在你的例子中),你真的想用內聯的方式(所以你只需要一次),優化的和更易讀的 - 類似於RichardTheKiwi下面描述的例子(但注意缺失括號)。這種方法會更直接/標準。 – Ilya

+0

要繼續:CASE對於使用列是非常有用的,並且可以通過順序,連接以及在哪裏進行復雜的決策......當然,CASE也可以在這裏以多種不同的方式工作(但是,可讀性差,且優化程度低很多,所以建議不要這樣): 'select * from tbl1 where(CASE WHEN @ searchField ='CompanyName'THEN CASE WHEN @searchOper ='eq'AND CompanyName = @searchString THEN 1 WHEN @ searchOper ='ne'AND CompanyName <> @searchString THEN 1 ELSE 0 END ELSE 0 END)= 1' – Ilya

1
declare @searchField varchar(50) 
declare @searchString varchar(50) 
declare @searchOper varchar(50) 

select * 
from tbl1 
where (@searchField <> 'companyName' 
     or 
     @searchOper = 'eq' and CompanyName = @searchString 
     or 
     @searchOper = 'ne' and CompanyName <> @searchString) 
    AND (@searchField <> 'StoreNum' 
     or 
     @searchOper = 'eq' and CompanyName = @searchString 
     or 
     @searchOper = 'ne' and CompanyName <> @searchString) 
option (recompile) 

這是寫的一種方式,它應該進行確定。你有什麼是www.sommarskog.se/dyn-search.html的變種,但OPTION (RECOMPILE)應該仍然每次都會產生一個最佳的計劃。

0
declare @searchField varchar(50) 
declare @searchString varchar(50) 
declare @searchOper varchar(50) 

SELECT 
    (case @searchField 
    when 'CompanyName' then 
     (case @searchOper 
      when 'eq' then 
      (select * from tbl1 where CompanyName = @searchString) 
     when 'ne' then 
      (select * from tbl1 where CompanyName <> @searchString) 
     end 
     ) 
    when 'StoreNum' then 
     (case @searchOper 
      when 'eq' then 
      (select * from tbl1 where StoreNum = @searchString) 
      when 'ne' then 
      (select * from tbl1 where StoreNum <> @searchString) 
     end 
     ) 
    end 
) a 

IM懶得建立TBL1,它更改爲GETDATE代替

declare @searchField varchar(50) 
declare @searchString varchar(50) 
declare @searchOper varchar(50) 

SET @searchField = 'CompanyName' 
SET @searchOper = 'eq' 
SELECT 
    (case @searchField 
    when 'CompanyName' then 
     (case @searchOper 
      when 'eq' then 
      (select getdate()) 
     when 'ne' then 
      (select getdate()) 
     end 
     ) 
    when 'StoreNum' then 
     (case @searchOper 
      when 'eq' then 
      (select getdate()) 
      when 'ne' then 
      (select getdate()) 
     end 
     ) 
    end 
) a 
+0

不,括號在這裏沒有幫助。 CASE不能像這樣使用(不在SQL Server中)。它預計在THEN之後(以及ELSE之後),而不是*查詢(或任何其他類型的*語句*)後的*標量表達式*。 –

+0

好吧,當我嘗試它的工作。我猜這是他想要的。當然我們可以建議一個正確的方式,但正如標題所述。案件內情況。 – Sid

+1

那麼,如果你的'tbl1'只有一列而且不超過一行,它可能已經起作用了。這樣'select *'可以被認爲是一個標量表達式。嘗試使用多行和/或多列,並且該查詢將失敗。 –

0

根據MSDN,

「的情況下表達不能被用來控制的Transact的執行流SQL語句,語句塊,用戶定義的函數和存儲過程。「

參考Here