반응형
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
반응형
'IT이야기' 카테고리의 다른 글
linq에서 .edmx와 .dbml 파일의 차이점 (0) | 2021.04.18 |
---|---|
Rails 자산 파이프 라인 : 모든 / vendor / assets / javascripts /?를 포함하는 표준 방법 (0) | 2021.04.18 |
CSS 블록의 마지막 세미콜론 제외 (0) | 2021.04.17 |
Node.js“심각한 오류 : JS 할당 실패-프로세스 메모리 부족”— 스택 추적 (0) | 2021.04.17 |
스칼라 세트는 동일한 요소를 포함하지만 sameElements ()는 false를 리턴합니다. (0) | 2021.04.17 |