【问题标题】:How to use CASE/IF statement in WHERE clause?如何在 WHERE 子句中使用 CASE/IF 语句?
【发布时间】:2019-07-14 23:37:17
【问题描述】:

我声明了 2 个变量,即 @empCode@centerCode。一个中心包含多名员工。我有另一个变量是@IsEmployeeBased 现在如果@IsEmployeeBased = 1,那么它将使用@empCode,否则它将使用@centerCode。 我的查询是这样的。

    DECLARE @IsEmployeeBased INT = 1;
    DECLARE @empCode INT = 1;
    DECLARE @centerCode INT = 3;
    SELECT * FROM Employee
    WHERE Department = 'Information Tech'
    AND 
    CASE WHEN @IsEmployeeBased = 1 THEN ID = @empCode ELSE CenterCode = @centerCode

这是返回错误,我认为 CASE 在 where 子句中是不允许的。有什么方法可以让所需的查询正常工作吗?

这里是示例数据:

CREATE TABLE Employee
(
ID Int,
EmployeeName VARCHAR(25),
Department VARCHAR(25),
CenterCode INT 
)

INSERT INTO Employee VALUES (1, 'Asim', 'Information Tech', 4)
INSERT INTO Employee VALUES (2, 'Ali', 'Information Tech', 2)
INSERT INTO Employee VALUES (3, 'Isaac', 'Information Tech', 3)
INSERT INTO Employee VALUES (4, 'Swagger', 'Information Tech', 4)
INSERT INTO Employee VALUES (5, 'Nadine', 'Information Tech', 2)
INSERT INTO Employee VALUES (6, 'Julie', 'Information Tech', 4)
INSERT INTO Employee VALUES (7, 'Meachum', 'Information Tech', 3)
INSERT INTO Employee VALUES (8, 'Bob Lee', 'Information Tech', 4)

【问题讨论】:

标签: sql-server


【解决方案1】:

CASE 表达式的谓词(即THENELSE 之后的内容)必须是一个常量值,而不是另一个逻辑表达式。您可以改写 WHERE 子句以不使用 CASE 表达式:

WHERE
    Department = 'Information Tech' AND (
    (@IsEmployeeBased = 1 AND ID = @empCode) OR
    (@IsEmployeeBased <> 1 AND enterCode = @centerCode))

【讨论】:

    【解决方案2】:

    您也可以尝试创建动态可执行查询,如下所示。

    DECLARE @IsEmployeeBased INT = 0;
    DECLARE @empCode INT = 1;
    DECLARE @centerCode INT = 3;
    
    DECLARE @Query NVarchar(500)
    SET @Query = N'SELECT * FROM Employee WHERE Department = ''Information Tech'''
    DECLARE @Where Varchar(250) = ''
    IF (@IsEmployeeBased = 1)
    BEGIN
        SET @Where += 'AND ID = ' + Convert(char(5), @empCode) +''
    END
    ELSE IF(@IsEmployeeBased <> 1)
    BEGIN
        SET @Where += 'AND CenterCode = ' + Convert(char(5), @centerCode) +''
    END
    SET @Query = @Query + @Where 
    
    --Select @Query
    EXECUTE sp_executesql @Query
    

    也请查看此thread

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多