我有一个电子邮件地址列表,其中一些在我的表中,其中一些不在。我想从该列表中选择所有电子邮件,以及它们是否在表中。
我可以让邮件地址在桌子上的用户如下:
SELECT u.* FROM USERS u WHERE u.EMAIL IN ('email1', 'email2', 'email3')
但是如何在该列表中选择表中不存在的值?
此外,我该如何选择:
E-Mail | Status
email1 | Exist
email2 | Exist
email3 | Not Exist
email4 | Exist
提前致谢。
答案 0 :(得分:80)
对于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)
对于以前的版本,您可以使用派生表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)
答案 1 :(得分:9)
您需要以某种方式创建包含这些值的表,然后使用NOT IN
。这可以通过临时表,CTE(公用表表达式)或Table Values Constructor(在SQL-Server 2008中可用)来完成:
SELECT email
FROM
( VALUES
('email1')
, ('email2')
, ('email3')
) AS Checking (email)
WHERE email NOT IN
( SELECT email
FROM Users
)
可以使用LEFT JOIN
或EXISTS
子查询找到第二个结果:
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)
答案 2 :(得分:2)
您应该有一张表格,其中包含要检查的电子邮件列表。然后执行此查询:
SELECT E.Email, CASE WHEN U.Email IS NULL THEN 'Not Exists' ELSE 'Exists' END Status
FROM EmailsToCheck E
LEFT JOIN (SELECT DISTINCT Email FROM Users) U
ON E.Email = U.Email
答案 3 :(得分:1)
如果您不想在列表中包含数据库中的电子邮件,您可以执行以下操作:
select u.name
, u.EMAIL
, a.emailadres
, case when a.emailadres is null then 'Not exists'
else 'Exists'
end as 'Existence'
from users u
left join ( select 'email1' as emailadres
union all select 'email2'
union all select 'email3') a
on a.emailadres = u.EMAIL)
这样你就会得到像
这样的结果name | email | emailadres | existence
-----|--------|------------|----------
NULL | NULL | a@b.com | Not exists
Jan | j@j.nl | j@j.nl | Exists
在这种情况下,使用IN或EXISTS运算符比左连接更重。
祝你好运:)答案 4 :(得分:0)
这适用于所有SQL版本。
SELECT E.AccessCode ,
CASE WHEN C.AccessCode IS NOT NULL THEN 'Exist'
ELSE 'Not Exist'
END AS [Status]
FROM ( SELECT '60552' AS AccessCode
UNION ALL
SELECT '80630'
UNION ALL
SELECT '1611'
UNION ALL
SELECT '0000'
) AS E
LEFT OUTER JOIN dbo.Credentials C ON E.AccessCode = c.AccessCode
答案 5 :(得分:0)
使用此: - SQL Server 2008或更高版本
SELECT U.*
FROM USERS AS U
Inner Join (
SELECT
EMail, [Status]
FROM
(
Values
('email1', 'Exist'),
('email2', 'Exist'),
('email3', 'Not Exist'),
('email4', 'Exist')
)AS TempTableName (EMail, [Status])
Where TempTableName.EMail IN ('email1','email2','email3')
) As TMP ON U.EMail = TMP.EMail