T-SQL: Comment sélectionner des valeurs dans la list des valeurs qui ne sont pas dans la table?

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