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 次 |
| 最近记录: |