表不为null时的Where子句,并返回属于同一状态

时间:2017-11-04 14:31:32

标签: sql sql-server

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

如果上传自定义列表,我想编写一个查询以返回该列表中的所有客户以及属于该州的所有客户。否则,如果没有设置列表,则返回未过滤的列表。

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

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

感谢您的阅读。

编辑:修复了别名错误

1 个答案:

答案 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
             );