Выбрать записи с подстрокой из другой таблицы - PullRequest
3 голосов
/ 27 октября 2010

У меня есть две таблицы:

data    
id   |email    
_   
1    |xxx@gmail.com    
2    |yyy@gmial.com    
3    |zzzgimail.com 

errors    
_    
error    |correct    
@gmial.com|@gmail.com    
gimail.com|@gmail.com    

Как выбрать из data все записи с ошибкой электронной почты? Спасибо.

Ответы [ 4 ]

1 голос
/ 27 октября 2010

Предполагая, что ошибка всегда находится в конце строки:

declare @data table (
    id int,
    email varchar(100)
)

insert into @data
    (id, email)
    select 1, 'xxx@gmail.com' union all
    select 2, 'yyy@gmial.com' union all
    select 3, 'zzzgimail.com'

declare @errors table (
    error varchar(100),
    correct varchar(100)
)

insert into @errors
    (error, correct)
    select '@gmial.com', '@gmail.com' union all
    select 'gimail.com', '@gmail.com'   

select d.id, 
       d.email, 
       isnull(replace(d.email, e.error, e.correct), d.email) as CorrectedEmail
    from @data d
        left join @errors e
            on right(d.email, LEN(e.error)) = e.error
1 голос
/ 27 октября 2010
SELECT d.id, d.email
FROM data d
    INNER JOIN errors e ON d.email LIKE '%' + e.error

Это возможно, однако выполнение команды LIKE с подстановочным знаком в начале сопоставляемого значения предотвратит использование индекса, что может привести к снижению производительности.

Оптимальным подходом было бы определить вычисляемый столбец в таблице данных, то есть ОБРАТНУЮ область поля электронной почты, и проиндексировать его. Это превратит приведенный выше запрос в условие LIKE с подстановочным знаком в конце, например:

SELECT d.id, d.email
FROM data d
    INNER JOIN errors e ON d.emailreversed LIKE REVERSE(e.error) + '%'

В этом случае производительность будет лучше, поскольку это позволит использовать индекс.

Я написал в блоге полное описание этого подхода некоторое время назад здесь .

0 голосов
/ 27 октября 2010
select * from 
(select 1 as id, 'xxx@gmail.com' as email union
 select 2 as id, 'yyy@gmial.com' as email union
 select 3 as id, 'zzzgimail.com' as email) data join

(select '@gmial.com' as error, '@gmail.com' as correct union
 select 'gimail.com' as error, '@gmail.com' as correct ) errors

 on data.email like '%' + error + '%' 

Я думаю ... что если вы не использовали подстановочный знак в начале, но где-то после, он мог бы выиграть от индекса. Если вы используете полнотекстовый поиск, это тоже может принести пользу.

0 голосов
/ 27 октября 2010

Ну, на самом деле вы не можете с информацией, которую вы предоставили.

В SQL вам потребуется вести таблицу «правильных» доменов.С этим вы могли бы сделать простой запрос, чтобы найти несоответствия.

Вы можете использовать некоторые «не» функциональные возможности SQL в SQL Server для проверки регулярных выражений, однако такая логика не ниже в SQLIMO).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...