如果在数据库中设置了自定义列表,我希望返回可能被过滤的客户值。
如果上传自定义列表,我想编写一个查询以返回该列表中的所有客户以及属于该州的所有客户。否则,如果没有设置列表,则返回未过滤的列表。
这是我写的希望能够实现我的目标,但如果列表被上传则无法过滤,如果注释掉则返回相同的数据:
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
感谢您的阅读。
编辑:修复了别名错误
答案 0 :(得分:1)
您的逻辑简化为:
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
,所以CASE
中的第三个条件永远不会被执行。
通常,布尔表达式比CASE
子句中的WHERE
语句更容易理解。至少,优化器更容易处理它们。
如果我理解你的条件正确,你似乎想要:
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
我不清楚为什么LIKE
使用userId
,=
似乎就足够了:
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
);