IT이야기

T-SQL : 테이블에 없는 값 목록에서 값을 선택하는 방법

cyworld 2021. 4. 18. 10:25
반응형

T-SQL : 테이블에없는 값 목록에서 값을 선택하는 방법은 무엇입니까?


이메일 주소 목록이 있는데 일부는 내 테이블에 있고 일부는 그렇지 않습니다. 해당 목록에서 모든 전자 메일을 선택하고 테이블에 있는지 여부를 선택하고 싶습니다.

다음과 같이 테이블에 메일 주소가있는 사용자를 가져올 수 있습니다.
SELECT u.* FROM USERS u WHERE u.EMAIL IN ('email1', 'email2', 'email3')

그러나 테이블에없는 값을 목록에서 어떻게 선택할 수 있습니까?

또한 다음과 같이 어떻게 선택할 수 있습니까?

E-Mail | Status
email1 | Exist  
email2 | Exist  
email3 | Not Exist  
email4 | Exist  

미리 감사드립니다.


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)

어떻게 든 이러한 값으로 테이블을 만든 다음 NOT IN. 이는 임시 테이블, CTE (공통 테이블 식) 또는 테이블 값 생성자 (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)

확인할 이메일 목록이있는 테이블이 있어야합니다. 그런 다음 다음 쿼리를 수행하십시오.

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

데이터베이스에있는 목록에 이메일을 포함하지 않으려면 다음을 수행 할 수 있습니다.

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 연산자를 사용하면 왼쪽 조인보다 더 무겁습니다.

행운을 빕니다 :)


이것은 모든 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

이것을 사용하십시오 :-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

참조 URL : https://stackoverflow.com/questions/9113204/t-sql-how-to-select-values-in-value-list-that-are-not-in-the-table

반응형