2017-08-08 63 views
2

我使用一个变量来让我选择在2个不同的“模式”运行:SQL - 不同的WHERE子句取决于变量

DECLARE @Mode as Varchar(1) = 'A' 

SELECT 
    CASE 
     WHEN @Mode = 'A' 
      THEN FieldABC * 2 
     ELSE FieldABC * 3 
    END AS FieldABC, 
    CASE 
     WHEN @Mode = 'A' 
      THEN FieldDEF 
     ELSE FieldGHI 
    END AS FieldJKL 

WHERE 
    FieldABC BETWEEN 0 AND 100 

当我要运行SELECT的“B”版本,我只需要改变变量值。这一切工作正常。

我现在想改变WHERE子句,以便它也取决于变量:

IF @Mode = 'A' THEN 
    WHERE FieldABC > 0 
ELSE 
    WHERE FieldABC < 0 
END IF 

除此之外,这种语法是SQL完全胡说八道!

如何根据相同变量实现我的WHERE子句的两种不同风格 - 或者在两种不同模式之间切换SELECT的其他简单方法?

+0

尝试使用[IF](https://msdn.microsoft。 com/pl-pl/library/ms182717(v = sql.110).aspx)。这种方法可能会损害您的执行计划(当然更复杂和反复查询,但这只是未来)。 –

回答

7

您可以用ANDOR组合做到这一点:

WHERE (@Mode='A' AND FieldABC > 0) 
OR (@Mode='B' AND FieldABC < 0); 

或者用CASE表达:

WHERE CASE 
     WHEN @Mode = 'A' AND FieldABC > 0 THEN 1 
     WHEN @Mode = 'B' AND FieldABC < 0 THEN 1 
     ELSE 0 
     END = 1; 
+0

天才!非常感谢你。我不知道我可以在WHERE子句中使用CASE语句,我会进一步调查! – Lefty

+0

我推荐个案建议。让我的小脑袋更有意义。 – SandPiper

+0

@SandPiper我实际上使用And/Or版本做了它,它完美地工作。这种结构对我来说很容易实现 - 但出于某种原因,我不明白可以使用它,直到我看到拉马克的答案。如果我诚实,我不完全理解CASE在这方面的工作方式;我们是说1 = true和0 = false,CASE语句的结果实际上是一个真/假的决定? – Lefty