当前位置: 首页 > 知识库问答 >
问题:

在多个电子邮件字段中查找重复项

罗昱
2023-03-14

我有一个奇怪的要求。我必须在我的数据库中找到重复的联系人记录(应该很简单),我的问题是我必须按名字、姓氏和任何相互匹配的电子邮件字段进行匹配。

Exemple:
FirstName    | LastName    | Email           | WorkEmail            | AnotherEmail
John           Smith          jh@jh.com         test@test.com          yougettheIdea.com
John           Smith          test@test.com                              
John           Smith          imAdifferent.jh.com

在本例中,我需要确定第1行和第2行中的John Smith是重复记录,但第3行中不是。基本上,我需要查询与FirstName匹配的FirstName、与LastName匹配的LastName以及与任何字段匹配的任何电子邮件字段。。。这可能吗?

我得到这个是为了匹配名字和姓氏,但电子邮件对我来说太多了:

SELECT * FROM
      (SELECT "FirstName","LastName","Email",","WorkEmail","AnotherEmail", count(*)
      OVER
        (PARTITION BY
          "FirstName",
          "LastName"
        ) AS count
      FROM Contact) tableWithCount
      WHERE tableWithCount.count > 1 ORDER BY count DESC;

共有2个答案

连厉刚
2023-03-14

我会在这里使用exists逻辑,将每个电子邮件列与每个其他列进行检查。以下查询标识所有没有重复记录的记录。

SELECT *
FROM Contact c1
WHERE NOT EXISTS (SELECT 1 FROM Contact c2
                  WHERE c2.LastName = c1.LastName AND c2.FirstName = c1.FirstName AND
                        c2.id <> c1.id AND  -- assuming there is a PK column id
                        (c2.Email = c1.Email OR c2.WorkEmail = c1.Email OR
                         c2.AnotherEmail = c1.Email
                         OR
                         c2.Email = c1.WorkEmail OR c2.WorkEmail = c1.WorkEmail OR
                         c2.AnotherEmail = c1.WorkEmail
                         OR
                         c2.Email = c1.AnotherEmail OR c2.WorkEmail = c1.AnotherEmail OR
                         c2.AnotherEmail = c1.AnotherEmail));

如果您想查找所有重复记录,则将“不存在”更改为“存在”。

拓拔骁
2023-03-14

我将构建一个电子邮件列数组,然后使用contains操作符检查重复项@

select *
from contact c1
where exists (select * 
              from contact c2
              where (c1.first_name, c1.last_name) = (c2.first_name, c2.last_name)
                and (    
                    array_remove(array[c1.email, c1.work_email, c1.another_email],null) @> array_remove(array[c2.email, c2.work_email, c2.another_email], null)
                 or array_remove(array[c1.email, c1.work_email, c1.another_email],null) <@ array_remove(array[c2.email, c2.work_email, c2.another_email], null) 
                )
                and c1.ctid <> c2.ctid
              );

表达式为c1。ctid

在线示例

 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 如何使用正则表达式验证电子邮件地址? (74个答案) 7年前关闭。 我试图从类似这样的字符串中获取电子邮件: 上面的代码可以收到一封电子邮件。 我怎么能得到所有? 问题答案: 尝试

  • 我认为正确的排序结果应该是: jack@gmail.com jack1@gmail.com 配置如下: 这是字段定义: 这是字段类型定义:

  • 可能重复: 如何从我的Android应用程序发送电子邮件? 我正在创建一个main。xml 如何在android中发送电子邮件。但必须是固定id(例如:myid@example.com) 我有main。xml

  • 我收到的消息是MimeMessage类型的。 假设我现在收到了一封新的电子邮件(X) 我想创建一个新的MimeMessage(Y),在它的正文中,它会说这封电子邮件是对(X)的响应(回复) p.s(Y)消息稍后将从不同的SMTP url发送,因此X和Y不相关。 多谢了。

  • 问题内容: 我知道电子邮件地址基本上可以无限期地长,因此我在varchar电子邮件地址字段中加上的任何大小都将是任意的。但是,我想知道“标准”是什么?你们做多久了?(与“姓名”字段相同的问题…) 更新: 显然,电子邮件地址的最大长度为320(<= 64名称部分,<= 255域)。你用这个吗? 问题答案: 理论上的限制确实很长,但您是否真的需要担心这些冗长的电子邮件地址?如果某人无法使用100字符的

  • 当发送带有消息ID头的任何电子邮件时,对它的任何回复都包括对该ID的命名的回复,以及可以命名父消息ID列表的引用,并且电子邮件客户端在线程视图中查看电子邮件列表时使用此信息来构造线程。 我的问题是:所有的电子邮件客户端(Outlook,Gmail,Exchange等)在发送回复到任何现有的电子邮件时,会在电子邮件头中追加回复字段吗? 我参考了RFC 2822,但它在回复中说字段是可选的。 In-R