2014-09-09 1 views
0

SQL Server에 클라이언트 테이블이 있습니다. 나는 email_address 열에서 중복을 찾으려고 노력하고 있지만 열 데이터의 일부만 고려해야하므로 하위 문자열을 고려해야합니다. 실용적인 측면에서 나는 기록에 중복 도메인 이름을 찾아야합니다.SQL Server : 한 열에 중복 된 하위 문자열 찾기

전 (전체 필드에서) 정확한 중복을 찾으려면 다음 쿼리를 사용했지만 어떻게 부분 문자열을 고려하여 수정할 수 있습니까?

SELECT a.email_address, b.dupeCount, a.client_id 
FROM tblClient a 
INNER JOIN (
    SELECT email_address, COUNT(*) AS dupeCount 
    FROM tblClient 
    GROUP BY email_address 
    HAVING COUNT(*) > 1 
) b ON a.email_address = b.email_address 

많은 감사!

+0

어떻게 당신은 이미 당신이 피벗은 더 나은 성능 수 있습니다 문자열 – Mihai

+0

에게 단지 보조 노트를 사용할 필요가 의심되는 경우 귀하의 시도에 대해 뭔가 당신이 얻으려고하는 데이터. – CodeMonkey1313

+0

이메일 주소 내의 일치하는 부분 문자열에 합류 해보십시오. –

답변

1

이 시도 :

declare @contact table (
    [client_id] [int] identity(1, 1) 
    , [email] [sysname] 
); 
insert into @contact 
     ([email]) 
values  (N'[email protected]_bobs.com'), 
     (N'[email protected]'), 
     (N'[email protected]_bobs.com'); 
with [stripper] 
as (select [client_id] 
      , [email] 
      , substring([email] 
         , charindex(N'@', [email], 0) + 1 
         , len([email])) as [domain_name] 
    from @contact), 
[duplicate_finder] 
as (select [client_id] 
      , [domain_name] 
      , row_number() 
       over (
        partition by [domain_name] 
        order by [domain_name]) as [sequence] 
    from [stripper]) 
select from [duplicate_finder] 
where [sequence] > 1; 
+0

답변 해 주셔서 감사합니다. 나는 실제로 중복 레코드를 삭제하려고하지 않는다. 삭제 부분없이이 작업을 수행하려면 어떻게해야합니까? – Adam92

+0

Adam, 귀하의 질문을 반영하기 위해 선택 진술로 업데이트되었습니다. –

+0

훌륭하고, 고맙습니다! – Adam92

0

이런 :

SELECT substr(email_address, 1, 2), count(*) 
FROM tblClient 
group by 1 
+0

고유 한 부분 문자열과 관련된 모든 행을 가져 오기 위해이 쿼리를 어떻게 수정 하시겠습니까? – zelusp