在 WHERE 子句的 CASE 表达式中使用 IS NULL

K09*_*K09 -3 null sql-server t-sql case

我有一个WHERE要在其中使用CASE表达式的子句。但是,我的CASE表达式需要检查字段是否为IS NULL.

如果@UserRole变量值 = 'Analyst',则SupervisorApprovedBy列值必须为NULL. 否则,我是说返回所有数据,即SupervisorApprovedBy = SupervisorApprovedBy.

我需要更改以下内容吗?

WHERE SupervisorApprovedBy = 
CASE 
    WHEN @UserRole = 'Analyst' THEN NULL
    ELSE SupervisorApprovedBy
END
Run Code Online (Sandbox Code Playgroud)

我不能使用=for NULL。经测试无效。

我希望返回所有行,包括那些 where SupervisorApprovedBy IS NOT NULL

ype*_*eᵀᴹ 13

问题很可能是与 的比较NULL,正如上面David Spillett 的回答所解释的那样。当 时@UserRole = 'Analyst',比较SupervisorApprovedBy = NULL将给出UNKNOWN(并且该行不会通过WHERE测试)。

您可以使用嵌套CASE表达式重写:

WHERE 1 =
  CASE 
    WHEN @UserRole = 'Analyst' THEN 
        CASE WHEN SupervisorApprovedBy IS NULL THEN 1 END
    WHEN SupervisorApprovedBy IS NOT NULL THEN 1
  END
Run Code Online (Sandbox Code Playgroud)

或者一个复杂的CASE表达式:

WHERE 1 =
  CASE 
    WHEN @UserRole = 'Analyst' AND SupervisorApprovedBy IS NULL THEN 1
    WHEN @UserRole = 'Analyst' THEN 0
    WHEN SupervisorApprovedBy IS NOT NULL THEN 1
  END
Run Code Online (Sandbox Code Playgroud)

或者更容易理解AND/ OR

WHERE 
    @UserRole = 'Analyst'  AND SupervisorApprovedBy IS NULL 
 OR @UserRole <> 'Analyst' AND SupervisorApprovedBy IS NOT NULL 
 OR @UserRole IS NULL      AND SupervisorApprovedBy IS NOT NULL 
Run Code Online (Sandbox Code Playgroud)

另一个问题是SupervisorApprovedBy = SupervisorApprovedBy(以及SupervisorApprovedBy IS NOT NULL我上面使用的等效项)不会为您提供“所有数据”。SupervisorApprovedBy不返回为空的行。如果您确实想要它们,则应调整所有条件:

WHERE 1 =
  CASE 
    WHEN @UserRole = 'Analyst' THEN 
        CASE WHEN SupervisorApprovedBy IS NULL THEN 1 END
    ELSE 1
  END


WHERE 1 =
  CASE 
    WHEN @UserRole = 'Analyst' AND SupervisorApprovedBy IS NULL THEN 1
    WHEN @UserRole = 'Analyst' THEN 0
    ELSE 1
  END


WHERE 
    @UserRole = 'Analyst'  AND SupervisorApprovedBy IS NULL 
 OR @UserRole <> 'Analyst' 
 OR @UserRole IS NULL       
Run Code Online (Sandbox Code Playgroud)


Dan*_*örk 6

我认为你让它变得比它应该的更难。

如果@UserRole 是 'Analyst' 那么 SupervisorApprovedBy 也应该为空?否则一切归还?

WHERE (@UserRole = 'Analyst' AND SupervisorApprovedBy IS NULL ) 
OR (ISNULL(@UserRole, '') <> 'Analyst')
Run Code Online (Sandbox Code Playgroud)