我想在SQL Server 2014查询的WHERE子句中使用完全不同的条件,而不仅仅是更改参数。
我有以下条款
putStrLn
如果变量@ cwid2为NULL或为空,我想用
替换AND-Statement的整个第一部分WHERE (dbo.SecurityCheckUserInADGroups.CWID = @cwid2) AND (dbo.SecurityCheckUserInDatabaseRoles.Server = @server)
因此,不仅参数而且列也会发生变化。
我尝试了If,Case和Iif这样的事情,但不接受:
dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @role2
它一直告诉我“在预期条件的上下文中指定的非布尔类型的表达式”
我有什么想法可以解决这个问题吗?
答案 0 :(得分:0)
WHERE CASE WHEN ISNULL(@cwid2,'') <> '' THEN dbo.SecurityCheckUserInADGroups
.CWID = @ cwid2 ELSE dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @ role2 END AND dbo.SecurityCheckUserInDatabaseRoles.Server = @server
答案 1 :(得分:0)
只需使用基本逻辑:
WHERE ((@cwid <> '' AND dbo.SecurityCheckUserInADGroups.CWID = @cwid2) OR
(COALESCE(@cwid, '') = '' AND dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @role2)
) AND
(dbo.SecurityCheckUserInDatabaseRoles.Server = @server)
答案 2 :(得分:0)
最通用的解决方案是
Where (@var is null and col1=val1)
Or (@var is not null and col2=val2)
因为查询优化器有时会阻塞OR,所以当性能可能成为一个问题(大数据集等)时,我倾向于寻找其他解决方案,但上面的内容可能值得先尝试。
如果你确实需要更具体的东西,那么iif逻辑的技巧是它返回一个值来进行比较,而不是一个要评估的谓词。你可以做点什么
Where col1 = iif(@var is null, val1, col1)
And col2 = iif(var is null, col2, val2)
这里的想法是,你不在乎&#34;不关心&#34; case - 就像var为null时col2的值 - 解析为&#34;始终为true&#34;。但是有些情况(例如当col1或col2可能为NULL时),此特定解决方案将失败。
这就是为什么第一种方法是最普遍的