.Dedupe电子邮件地址,地址中包含唯一的数字字符串

时间:2015-12-22 19:52:28

标签: sql duplicates

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开头的重复电子邮件地址。     然后将重复项删除到一个唯一的电子邮件地址。 问题是它们在GUEST和我试图重复删除的实际电子邮件地址之间引用了不同的数字。

EXAMPLE

GUEST635547889019125156DOGU@HTVA.NET
GUEST635547889110697422DOGU@HTVA.NET
GUEST635547889125638828DOGU@HTVA.NET
GUEST635547893650472813DOGU@HTVA.NET
GUEST635547893772132969DOGU@HTVA.NET
GUEST635547964640101719PHILIPKING@GMAIL.COM
GUEST635547965258978672PHILIPKING@GMAIL.COM

2 个答案:

答案 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”执行)。

答案 1 :(得分: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()PATINDEXLEN(),{{ 1}} - 解析数字:

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%'; 以识别此类重复项。