SQL 服务器:where 语句中的条件使用列作为条件

SQL Server : conditional in where statement using colunm as a condition

如何在使用不同条件列的 where 子句中使用条件大小写?

请参考以下代码

if OBJECT_ID('tempdb..#MemberInfo') is not null
drop table #MemberInfo  

DECLARE @GroupID varchar(60),
@Eoid varchar(60);

set @GroupID='23'    
set @Eoid = null;

select a.memberid, a.membername, a.groupid, a.eoid
from membermst a 
where
    case 
       when @GroupID is not null 
          then a.groupid = @GroupID // this is an error
       when @Eoid is not null 
          then a.eoid = @Eoid // this is an error    
       when @GroupID is null and @Eoid is null 
          then select all records // this is an error
end 

这些是我的过滤条件

注意这是我程序的条件

  1. groupid和eoid可以同时为null
  2. groupid或eoid只能有一个值
  3. 如果 groupid 有值则 eoid 为空
  4. 如果 eoid 有值则 groupid 为空
  5. groupid 不能同时有值。 then 中的任何一个都只有一个值

是否可以使用 SQL 查询?

只需使用常规布尔逻辑:

select m.memberid, m.membername, m.groupid, m.eoid
from membermst m
where (@GroupID is not null and a.groupid = @GroupID) or
      (@GroupID is null and @Eoid is not null and a.eoid = @Eoid) or
      (@GroupID is null and @Eoid is null)

这实际上可以简化为:

select m.memberid, m.membername, m.groupid, m.eoid
from membermst m
where (a.groupid = @GroupID) or
      (@GroupID is null and a.eoid = @Eoid) or
      (@GroupID is null and @Eoid is null)

is not null 比较实际上是多余的。

这里不用写CASE WHEN,直接把你的WHERE改成

就可以了
where (@GroupID IS NULL OR a.groupid = @GroupID) AND (@Eoid IS NULL OR a.eoid=@Eoid)

如果 @GroupID@Eoid 都是 NULL,那么您将通过这种方式获取所有记录,如果指定,它将匹配具有相应 ID 的记录。

这实际上可以通过以下方式完成:

select a.memberid, a.membername, a.groupid, a.eoid
    from membermst a 
    where    
    ((@GroupID is null)or((@GroupID is not null)and (a.groupid = @GroupID)))