【问题标题】:SQL - Match email address text before @ symbol from two tablesSQL - 匹配两个表中@符号之前的电子邮件地址文本
【发布时间】:2014-01-30 22:57:42
【问题描述】:

我正在尝试从两个表中匹配相似的电子邮件地址。我想做的是查找表1中的电子邮件地址与表2中的电子邮件地址相似的记录(其中@符号之前的文本相同)。例如,JohnSmith@gmail.com 将匹配 JohnSmith@yahoo.com。

【问题讨论】:

  • 子字符串语法因数据库类型而异...您在哪个数据库中?
  • 我要匹配的数据在 MS Access 表中。我们的完整数据库是 MYSQL,但我有只读权限,所以我将电子邮件地址列表导出到 Access。
  • Access 工作起来非常痛苦,不确定它是否能够处理这个问题。在这里,您只需要读取权限……请参考以下答案的建议,在 MySQL 中进行。编辑您的问题以添加标签
  • @Twelfth re: “Access 工作起来很痛苦” - 没有不尊重的意思(好吧,反正不多),但在你的情况下,我怀疑使用 Access就像性:如果它真的那么痛苦,那么你可能只是做得不对。
  • @GordThompson 只能说用 SQL 锄头挖洞比用变形的小勺子挖洞要容易。

标签: mysql sql ms-access


【解决方案1】:

对于 Access,您可以使用如下查询:

SELECT
    t1.ID AS ID1,
    t1.Email AS Email1,
    t2.ID AS ID2,
    t2.Email AS Email2
FROM
    Table1 AS t1
    INNER JOIN
    Table2 as t2
        ON Left(t1.Email,InStr(t1.Email,'@')-1) = Left(t2.Email,InStr(t2.Email,'@')-1)

编辑回复:评论

如果您由于尝试加入的字段中的空值而收到“条件表达式中的数据类型不匹配”错误,请尝试此操作

SELECT 
    t1.ID AS ID1, 
    t1.Username AS Email1, 
    t2.ID AS ID2, 
    t2.email AS Email2
FROM 
    USERS AS t1 
    INNER JOIN 
    LICENSE AS t2 
        ON Left(Nz(t1.Username,''),InStr(Nz(t1.Username,''),'@')-1) = Left(Nz(t2.email,''),InStr(Nz(t2.email,''),'@')-1);

编辑 2

...或者你可能更喜欢这样的东西:

SELECT 
    t1.ID,
    t1.Username AS Email
FROM 
    USERS AS t1 
WHERE
    EXISTS
        (
            SELECT * 
            FROM LICENSE AS t2 
                WHERE Left(Nz(t1.Username,''),InStr(Nz(t1.Username,''),'@')-1) = Left(Nz(t2.email,''),InStr(Nz(t2.email,''),'@')-1)
        )

【讨论】:

  • 这似乎有效,但随后我收到“标准表达式中的数据类型不匹配”错误消息。这两个 ID 都是 Autonumber,t1.Username 和 t2.email 都是文本,所以我不确定是什么导致了问题。会不会是表中的某些数据有问题?
  • SELECT t1.ID AS ID1, t1.Username AS Email1, t2.ID AS ID2, t2.email AS Email2 FROM USERS AS t1 INNER JOIN LICENSE as t2 ON Left(t1.Username,InStr( t1.Username,'@')-1) = Left(t2.email,InStr(t2.email,'@')-1)
  • @MattJanachek 上述评论中的查询是否适合您? (我觉得很好。)
  • 它开始显示结果,但大约 20 秒后出现“标准表达式中的数据类型不匹配”错误。我确保所有数据中都有一个“@”。我想知道带有奇怪电子邮件地址(例如“@gmail.com”)的记录是否会导致问题。
  • 非常感谢!现在查询正在运行,我发现 null 和没有“@”符号的记录。我认为这需要一段时间(将 145k 电子邮件地址与 1k 电子邮件地址进行比较)。
【解决方案2】:

内连接表AB 具有这样的theta(在T-SQL 语法中):

ON SUBSTRING(A.Email, 1, CHARINDEX('@', A.Email)) = SUBSTRING(B.Email, 1, CHARINDEX('@', B.Email))

从 MS Access 切换到 MySQL 时,您的语法将完全改变,因此请选择 MySQL 语法。以上不是你的问题的有效解决方案,但它会引导你走向它。

【讨论】:

    【解决方案3】:

    这是执行此操作的 MySQL 语法:

    on substring_index(a.Email, '@', 1) = substring_index(b.Email, '@', 1)
    

    【讨论】:

      【解决方案4】:

      在 SQl 中,您可以执行类似这样的操作,只需输入并选择 @ 之前的所有内容,两个表中的列名都是“电子邮件”:

      SELECT SUBSTRING(Email,0, CHARINDEX('@',Email)) 
      from [TABLE1] 
      where SUBSTRING(email,0, CHARINDEX('@',email))
      in (SELECT SUBSTRING(email,0, CHARINDEX('@',email)) from [TABLE2])
      

      【讨论】:

      • 刚刚看到添加了 mySQL 标记,所以猜我的答案不相关。类似的东西可能在访问中起作用,尽管它是微软,你可以在访问中查询两个表
      猜你喜欢
      • 1970-01-01
      • 2012-07-04
      • 2016-03-20
      • 2014-12-13
      • 1970-01-01
      • 2023-04-03
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多