Sql Where子句when table不为null并返回属于相同状态的用户和用户的列表

Sql Where子句when table不为null并返回属于相同状态的用户和用户的列表,sql,sql-server,Sql,Sql Server,如果在数据库中设置了自定义列表,我希望返回可能被过滤的客户值 如果上传了自定义列表,我想编写一个查询,返回该列表中的所有客户以及属于该状态的任何客户。否则,如果没有设置列表,只需返回未筛选的列表 这是我写的,希望能够实现我的目标,但它无法过滤列表是否上传,如果被注释掉,则返回相同的数据: SELECT U.userId ,U.State FROM UsersAndStates U LEFT JOIN @CustomUsersAndState C -- v

如果在数据库中设置了自定义列表,我希望返回可能被过滤的客户值

如果上传了自定义列表,我想编写一个查询,返回该列表中的所有客户以及属于该状态的任何客户。否则,如果没有设置列表,只需返回未筛选的列表

这是我写的,希望能够实现我的目标,但它无法过滤列表是否上传,如果被注释掉,则返回相同的数据:

SELECT U.userId
      ,U.State 
       FROM UsersAndStates U
       LEFT JOIN @CustomUsersAndState C -- variable table where custom list is stored for this query
       on U.userId= C.userId
WHERE U.userId LIKE CASE WHEN C.userId IS NOT NULL
                         THEN '%' + C.userId + '%'
                         WHEN C.userId IS NULL
                         THEN '%' + U.userId + '%'
                         WHEN C.State = U.State 
                         THEN '%' + U.userId + '%
                         END
谢谢你的阅读


编辑:修复别名错误

您的逻辑简化为:

SELECT U.userId, U.State 
FROM UsersAndStates U LEFT JOIN
     @CustomUsersAndState C -- variable table where custom list is stored for this query
     ON U.userId= C.userId
WHERE (C.UserId IS NOT NULL AND U.userId LIKE '%' + C.userId + '%') OR
      C.userId IS NULL
您可能会问:“
c.userId
NULL
或不是
NULL
,因此
案例中的第三个条件永远不会执行

通常,布尔表达式被认为比
WHERE
子句中的
CASE
语句更容易理解。至少,优化器更容易处理它们

如果我正确理解您的情况,您可能希望:

SELECT U.userId, U.State 
FROM UsersAndStates U LEFT JOIN
     @CustomUsersAndState C -- variable table where custom list is stored for this query
     ON U.userId = C.userId
WHERE (C.UserId IS NOT NULL AND
       (U.userId LIKE '%' + C.userId + '%' OR
        U.state = C.state
       )
      ) OR
      C.userId IS NULL
我不清楚您为什么要对
用户ID使用
LIKE
,而
=
似乎就足够了:

WHERE (C.UserId IS NOT NULL AND (U.userId = C.userId OR U.state = C.state)
      ) OR
      C.userId IS NULL
编辑:

我认为你真正想要的逻辑是:

SELECT U.userId, U.State 
FROM UsersAndStates U 
WHERE NOT EXISTS (SELECT 1 FROM @CustomUsersAndState C) OR
      EXISTS (SELECT 1
              FROM @CustomUsersAndState C
              WHERE U.userId LIKE C.userId OR U.state = C.state
             );

S.userId
从何而来?抱歉,这是一个格式错误。我只是在原始问题中添加了一条注释,关于对
userId
使用
=
而不是
=
进行比较,当我看到您添加了答案时。搜索模式中的前导通配符会对性能产生重大影响。感谢您的解释。类似于
只是我最后一次尝试返回一些东西。不幸的是,您的建议将返回所有不属于该状态的其他用户。
前面的子句的第一部分将向用户返回筛选后的列表。@WSilhavy。我不明白这个评论。如果
c.UserId
NULL
,则第二个表为空。因此,将返回所有用户。很抱歉造成混淆。我的意思是,该条款的第一部分只返回上传的用户,而不返回不属于上传的状态的用户。使用整个语句只会返回未过滤的结果,即使第二个语句中有记录table@WSilhavy . . . 请参阅我的编辑。你不想加入
组织