T-SQL:如何选择值列表中不在表中的值?

kub*_*lay 55 sql t-sql sql-server

我有一个电子邮件地址列表,其中一些在我的表中,其中一些不在.我想从该列表中选择所有电子邮件,以及它们是否在表中.

我可以让那些邮件地址在桌子上的用户像这样:
SELECT u.* FROM USERS u WHERE u.EMAIL IN ('email1', 'email2', 'email3')

但是如何在该列表中选择表中不存在的值?

而且,我该怎么选择这样:

E-Mail | Status
email1 | Exist  
email2 | Exist  
email3 | Not Exist  
email4 | Exist  
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Mar*_*ith 83

对于SQL Server 2008

SELECT email,
       CASE
         WHEN EXISTS(SELECT *
                     FROM   Users U
                     WHERE  E.email = U.email) THEN 'Exist'
         ELSE 'Not Exist'
       END AS [Status]
FROM   (VALUES('email1'),
              ('email2'),
              ('email3'),
              ('email4')) E(email)  
Run Code Online (Sandbox Code Playgroud)

对于以前的版本,您可以使用派生表执行类似UNION ALL的操作 - 常量.

/*The SELECT list is the same as previously*/
FROM (
SELECT 'email1' UNION ALL
SELECT 'email2' UNION ALL
SELECT 'email3' UNION ALL
SELECT 'email4'
)  E(email)
Run Code Online (Sandbox Code Playgroud)


ype*_*eᵀᴹ 9

您需要以某种方式创建一个包含这些值的表,然后使用NOT IN.这可以使用临时表,CTE(公用表表达式)或表值构造函数(在SQL-Server 2008中提供)来完成:

SELECT email
FROM
    ( VALUES 
        ('email1')
      , ('email2')
      , ('email3')
    ) AS Checking (email)
WHERE email NOT IN 
      ( SELECT email 
        FROM Users
      ) 
Run Code Online (Sandbox Code Playgroud)

可以使用LEFT JOINEXISTS子查询找到第二个结果:

SELECT email
     , CASE WHEN EXISTS ( SELECT * 
                          FROM Users u
                          WHERE u.email = Checking.email
                        ) 
            THEN 'Exists'
            ELSE 'Not exists'
       END AS status 
FROM
    ( VALUES 
        ('email1')
      , ('email2')
      , ('email3')
    ) AS Checking (email)
Run Code Online (Sandbox Code Playgroud)