SQL-连接语句难题

时间:2018-08-16 18:13:31

标签: sql

在这里拼图!

我有一个名为whitelist的表,一个名为bans的表。 每个用户由一个标识符标识。 用户可以是:

  • 未禁止,未列入白名单。
  • 被禁止,未列入白名单。
  • 未被禁止,已列入白名单。
  • 被禁止,列入白名单。

如果用户被禁止,则会在bans表中创建一行。 如果用户被列入白名单,则会在白名单表中创建一行。

我有一条下面的SQL语句,用于检查用户是否被禁止或列入白名单: SELECT * FROM whitelist FULL JOIN bans ON bans.identifier=whitelist.id

问题是:如果未将用户列入白名单,则whitelist.id不存在(显然)。但是如何处理所有情况?

谢谢。

2 个答案:

答案 0 :(得分:2)

我将假设您有一个用户表。根据您的RDBMS,可以使用存在或联接。这将使您可以检查禁令或白名单中是否存在用户记录。

使用该命令检查该用户是否出现在任何一个表中:

SELECT u.* 
FROM user u
WHERE EXISTS (
SELECT 1 
FROM whitelist wl
ON wl.userID = u.userid)
OR EXISTS (
SELECT 1 
FROM ban b
WHERE b.userid = u.userID)

或者您可以使用联接并检查NULL,然后有条件地将NULL更改为1或0,是或否,等等。

SELECT u.*, wl.userID, b.userID 
FROM user u
LEFT JOIN whitelist wl
ON wl.userID = u.userID
LEFT JOIN ban b
ON b.userID = u.userid
WHERE wl.userID IS NOT NULL
or b.userID IS NOT NULL

答案 1 :(得分:0)

我认为您需要将它们结合起来的逻辑:

select coalesce(b.identifier, w.id) as id,
       (case when b.identifier is not null and w.identifier is not null then 'both'
             when b.identifier is not null then 'ban'
             else 'whitelist'
        end) as which
from bans b full join
     whitelist w
     on b.identifier = w.id  -- why do these have different names