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)
我认为你让它变得比它应该的更难。
如果@UserRole 是 'Analyst' 那么 SupervisorApprovedBy 也应该为空?否则一切归还?
WHERE (@UserRole = 'Analyst' AND SupervisorApprovedBy IS NULL )
OR (ISNULL(@UserRole, '') <> 'Analyst')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
65617 次 |
最近记录: |