2010-02-15 135 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上的索引,这显然不理想(反之亦然)。