2015-12-22 2 views
0
SELECT WEB_LOGIN 
FROM dbo.Name_Security 
WHERE WEB_LOGIN like 'GUEST%[A-Z][A-Z]%@[A-Z][A-Z]%.%[A-Z][A-Z][A-Z]%' 

Попытка выполнить запрос, чтобы найти повторяющиеся адреса электронной почты, которые начинаются с GUEST. Затем удалите дубликаты на один уникальный адрес электронной почты. Проблема: они имеют разные номера, на которые ссылаются между ГОСТЕЙ и фактическим адресом электронной почты, который я пытаюсь отключить.. Адрес электронной почты Dedupe с уникальной строкой цифр по адресу

EXAMPLE 

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
+0

Какая СУБД вы используете? –

ответ

0

Я не думаю, что есть способ достичь этого только с помощью SQL.

Вместо этого, вы можете получить адреса и локально обрабатывать их, чтобы получить список дубликатов, как это:

// Depending on your context, use any way to get the result of the simple query 
// "SELECT WEB_LOGIN FROM dbo.Name_Security" 
// as an array of (WEB_LOGIN) in $raw_addresses 

// Extract bare-addresses from raw-addresses 
$bare_addresses = preg_replace('/^GUEST[\d]+(.*)$/i', '$1', $raw_addresses); 
// Then create collections of raw-addresses for each bare-address 
foreach ($bare_addresses as $index => $bare_address) { 
    $collections[$bare_address][] = $raw_addresses[$index]; 
} 
// Select only collections having more than one index 
$duplicates = array_filter($collections, function($indexes) { 
    return count($indexes > 1); 
}); 
// Finally use duplicates to whatever you want... 

Вы можете видеть, что это работает, основываясь на вашем данном примере: 4fi9-dx5v (нажмите на кнопку «Run -F9 "для выполнения).

0

рассмотреть возможность запуска вложенных REPLACE(), чтобы удалить цифры в поле:

SELECT 
    Replace(
     Replace(
      Replace(
       Replace(
        Replace(
         Replace(
          Replace(
           Replace(
            Replace(
             Replace(WEB_LOGIN, '0', ''), 
             '1', ''), 
            '2', ''), 
           '3', ''), 
          '4', ''), 
         '5', ''), 
        '6', ''), 
       '7', ''), 
      '8', ''), 
     '9', '') 
FROM dbo.Name_Security 
WHERE WEB_LOGIN LIKE 'GUEST%'; 

В качестве альтернативы, так как вы разместите префикс dbo так предполагаю, что это SQL Server, используется ряд строковых функций - SUBSTRING(), PATINDEX, LEN(), REVERSE() - чтобы разобрать цифры:

SELECT 
     SUBSTRING(WEB_LOGIN, 
       LEN(WEB_LOGIN)+1 - PATINDEX('%[0-9]%', REVERSE(WEB_LOGIN))+1, 
       LEN(WEB_LOGIN)) 
FROM dbo.Name_Security 
WHERE WEB_LOGIN LIKE 'GUEST%'; 

Один нюанс обоих вариантов адресов электронной почты, которые содержат числа, но все дубликаты будут обрабатываться вместе. Добавьте идентификатор GROUP BY ... HAVING COUNT(*) > 1 для идентификации таких дубликатов.