J'ai une list d'adresses e-mail, certaines d'entre elles sont dans ma table, d'autres non. Je veux sélectionner tous les e-mails de cette list et s'ils sont dans la table ou non.
Je peux get des users dont les adresses de messagerie sont dans la table comme ceci:
SELECT u.* FROM USERS u WHERE u.EMAIL IN ('email1', 'email2', 'email3')
Mais comment puis-je sélectionner des valeurs dans cette list qui n'existent pas dans le tableau?
De plus, comment puis-je sélectionner comme ceci:
E-Mail | Status email1 | Exist email2 | Exist email3 | Not Exist email4 | Exist
Merci d'avance.
Pour 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)
Pour les versions précédentes, vous pouvez faire quelque chose de similaire avec une table dérivée UNION ALL
-ing les constantes.
/*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)
Vous devez créer une table avec ces valeurs et utiliser NOT IN
. Cela peut être fait avec une table temporaire, un CTE (Common Table Expression) ou un constructor de valeurs de table (disponible dans SQL Server 2008):
SELECT email FROM ( VALUES ('email1') , ('email2') , ('email3') ) AS Checking (email) WHERE email NOT IN ( SELECT email FROM Users )
Le deuxième résultat peut être trouvé avec une LEFT JOIN
ou une sous-requête 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)
Vous devriez avoir une table avec la list des emails à vérifier. Ensuite, faites cette requête:
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
Lorsque vous ne souhaitez pas que les e-mails de la list se trouvent dans la database, vous pouvez effectuer les opérations suivantes:
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)
de cette façon, vous obtiendrez un résultat comme
name | email | emailadres | existence -----|--------|------------|---------- NULL | NULL | [email protected] | Not exists Jan | [email protected] | [email protected] | Exists
L'utilisation des opérateurs IN ou EXISTS est plus lourde que celle de gauche dans ce cas.
Bonne chance 🙂
Cela devrait fonctionner avec toutes les versions 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
Utilisez ceci: – SQL Server 2008 ou plus tard
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