SQL - 不同的WHERE子句依赖于变量

Lef*_*fty 2 sql sql-server

我正在使用变量让我的SELECT以2种不同的"模式"运行:

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
Run Code Online (Sandbox Code Playgroud)

当我想运行SELECT的"B"版本时,我只需要更改变量值.一切正常.

我现在想要更改WHERE子句,因此它也依赖于变量:

IF @Mode = 'A' THEN 
   WHERE FieldABC > 0 
ELSE 
   WHERE FieldABC < 0
END IF 
Run Code Online (Sandbox Code Playgroud)

除此之外,这种语法在SQL中完全是无意义的!

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

Lam*_*mak 7

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

WHERE (@Mode='A' AND FieldABC > 0)
OR (@Mode='B' AND FieldABC < 0);
Run Code Online (Sandbox Code Playgroud)

或者用CASE表达式:

WHERE CASE 
         WHEN @Mode = 'A' AND FieldABC > 0 THEN 1
         WHEN @Mode = 'B' AND FieldABC < 0 THEN 1
         ELSE 0 
      END = 1;
Run Code Online (Sandbox Code Playgroud)