2012-02-02 10 views
47

मेरे पास ई-मेल पते की एक सूची है, उनमें से कुछ मेरी मेज में हैं, उनमें से कुछ नहीं हैं। मैं उस सूची से सभी ई-मेल चुनना चाहता हूं और चाहे वे तालिका में हैं या नहीं।टी-एसक्यूएल: मूल्य सूची में मूल्यों का चयन कैसे करें जो तालिका में नहीं हैं?

मैं कर सकते हैं पाने के जिन उपयोगकर्ताओं की मेल पतों इस तरह तालिका में कर रहे हैं:
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

क्या आप माइक्रोसॉफ्ट के एसक्यूएल सर्वर से T-SQL मतलब है? यदि हां, तो कौन सा संस्करण? – hvd

+1

हां, एमएस एसक्यूएल सर्वर। मैं 2005 और 2008 आर 2 दोनों का उपयोग कर रहा हूं। – kubilay

+0

ठीक है, उस मामले में मैं मार्टिन स्मिथ के जवाब की सलाह देता हूं। मैंने पूछा क्योंकि एसक्यूएल सर्वर 2000 अभी भी एक उचित राशि का उपयोग किया गया है और उसका जवाब उस पर काम नहीं करेगा। – hvd

उत्तर

65

एसक्यूएल सर्वर के लिए 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) 

पिछले संस्करणों आप एक व्युत्पन्न तालिकाके साथ इसी तरह कुछ कर सकते हैं के लिए-स्थिरांक।

/*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) 
+0

दोनों समाधान प्रदान करने के लिए धन्यवाद! – user219628

+0

सुंदर। धन्यवाद – dLight

6

आपको इन मानों के साथ किसी भी तरह की तालिका बनाने की आवश्यकता है और फिर NOT IN का उपयोग करें।

SELECT email 
FROM 
    (VALUES 
     ('email1') 
     , ('email2') 
     , ('email3') 
    ) AS Checking (email) 
WHERE email NOT IN 
     (SELECT email 
     FROM Users 
    ) 

दूसरा परिणाम एक LEFT JOIN या एक EXISTS सबक्वेरी के साथ पाया जा सकता है: यह एक अस्थायी मेज, एक CTE (आम तालिका अभिव्यक्ति) या एक Table Values Constructor (में उपलब्ध SQL- सर्वर 2008) के साथ किया जा सकता है

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) 
+1

यह उस तालिका में मान देता है जो सूची में नहीं है। सवाल यह दूसरी तरफ से पूछता है: सूची में मौजूद जो सूची में नहीं हैं। – hvd

+0

संपादन के साथ, यह अभी भी सही नहीं होगा यदि 'users.email' शून्य है (और हम नहीं जानते कि यह है या नहीं) – hvd

+0

@hvd: आप सही हैं, हम नहीं जानते कि यह शून्य है या नहीं। हालांकि क्वेरी सही ढंग से जवाब देगी। –

2

आपके पास जांच करने के लिए ईमेल की सूची के साथ एक टेबल होना चाहिए।

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) 

इस तरह से आप प्राप्त करेंगे:

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 
+0

धन्यवाद, मैं लंबे समय से नहीं जाना चाहता था। मार्टिन के जवाब ने ऐसा किया। – kubilay

1

आप सूची में ईमेल है कि डेटाबेस में हैं नहीं करना चाहती जब आप निम्न कर सकते हैं करेंगे: तो फिर इस क्वेरी करना नतीजतन

name | email | emailadres | existence 
-----|--------|------------|---------- 
NULL | NULL | [email protected] | Not exists 
Jan | [email protected] | [email protected]  | Exists 

IN या EXISTS ऑपरेटरों का उपयोग करना अधिक भारी है तो बाएं इस मामले में शामिल हों।

गुड लक :)

+0

धन्यवाद, आपका उत्तर देर से लेकिन सही भी है। मुझे खुशी है कि मुझे मूल्यों के लिए एक टेबल बनाने की ज़रूरत नहीं थी। – kubilay

+2

'EXISTS' बाहरी शॉर्ट सर्किट के रूप में बाहरी शामिल होने से अधिक कुशल होगा। यदि उपयोगकर्ता 'में' डुप्लीकेट हैं तो आप एक ही पते को कई बार वापस ला सकते हैं। 'EXISTS' को कैसे प्रबंधित किया जाता है, इस बारे में कुछ विवरणों के लिए [CASE अभिव्यक्तियों में सबक्वायरीज़] (http://blogs.msdn.com/b/craigfr/archive/2006/08/23/715306.aspx) देखें। –

0

यह सब एसक्यूएल संस्करणों के साथ काम करना चाहिए।

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 
0

इस का उपयोग करें: - एसक्यूएल सर्वर 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 
संबंधित मुद्दे