如何在WHERE子句中使用条件不同的列?

时间:2016-11-07 13:05:58

标签: sql sql-server sql-server-2014

我想在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

它一直告诉我“在预期条件的上下文中指定的非布尔类型的表达式”

我有什么想法可以解决这个问题吗?

3 个答案:

答案 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时),此特定解决方案将失败。

这就是为什么第一种方法是最普遍的