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 . . . 请参阅我的编辑。你不想加入组织
。