2010-02-15 102 views
0

海拉所有檢索SELECT SQL表,通過IF語句

我想要做的就是這樣的事情,我將有一個SQL表將取決於我的參數,

DECLARE @find varchar(30) 
SET @find = 'no' 

SELECT * FROM 
(

    if @find = 'yes' 
    (
    SELECT * FROM myTable 
    WHERE ID= '5882' 
    ) 
    ELSE 
    (
    SELECT * FROM myTable 
    WHERE OLD_ID= '5882' 
    ) 

) X 

這僅僅是一個我給出了一個簡單的表格作爲例子,我真正的sql查詢更大,所以我不認爲我可以在此查詢中使用動態sql。所以我需要其他方式。

回答

1

使用「搜索功能CASE」是這樣的:

WHERE 
    CASE 
     WHEN @find = 'no' THEN ID 
     WHEN @find = 'yes' THEN OLD_ID 
     -- put an ELSE clause here 
     -- if you want to catch @find not being no or yes 
    END 
    = '5882' 
+0

不是確切的問題答案,但這是我需要的,也是一個很好的方法。我打算通過列名作爲參數,這是一種做法。謝謝。 – stckvrflw

0

您可以使用EXEC來執行SQL字符串。你必須介意報價。

DECLARE @column varchar(max); 
SET @column = 'OLD_ID' 

EXEC('SELECT * FROM myTable WHERE ' + @column + ' = ''5882''') 
0

爲了確保最佳的執行計劃,我建議你創建單獨的查詢,並調用相應的一個根據「@find」。 例如 SPROC1將查詢的ID SPROC2將在OLD_ID

查詢

然後要麼,改變你的調用代碼調用相應的存儲過程,或者,如果你只是想通過@find作爲參數,創建存儲過程3次,只是用作重定向: SPROC3:

IF (@find = 'no') 
    EXECUTE SPROC1 
ELSE IF (@find = 'yes') 
    EXECUTE SPROC2 
ELSE 
    .... 

與其它方法的風險是執行計劃污染由此計劃被用於一個路徑中創建(例如@找到=「否」),然後,當隨後的呼叫與進來@ find ='yes'它最終使用了不太合適的執行計劃,導致性能不佳。換句話說,不是在ID上使用索引,而是可能最終使用OLD_ID上的索引,這顯然不理想(反之亦然)。