MS Access“无效过程调用”将电子邮件地址的前半部分与另一个表中的电子邮件地址相匹配

时间:2014-01-31 21:31:41

标签: sql ms-access ms-access-2010

在Access 2010数据库中的表上运行以下代码时,我遇到了“无效的过程调用”,但它在Access 2000 db中运行。

我没有写这段代码,我知道它是在'@'符号之前的文本,但我很想听到我在这里看到的具体语法的解释:“左(Nz(t1。用户名,''),InStr(Nz(t1.Username,''),'@') - 1)=左(Nz(t2.email,''),InStr(Nz(t2.email,''), '@') - 1)     ))≤;>假));“

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)
    ))<>False)); 

2 个答案:

答案 0 :(得分:1)

如果t1.UserName为null,则Nz(t1.Username,'')返回空字符串('')。

现在,假设t1.Username是aa.gmail.com

然后是InStr(Nz(t1.Username,''),'@') - 1将是3 - 1 = 2 所以,左(Nz(t1.Username,''),InStr(Nz(t1.Username,''),'@') - 1)将被留下('aa.gmail.com',2)= aa < / p>

因此,这个表达式基本上是在@。

之前提取电子邮件地址的一部分

左(Nz(t2.email,''),InStr(Nz(t2.email,''),'@') - 1)对t2.email做同样的事情

所以where子句将@之前的t1.username部分与@之前的t2.email部分进行比较。

可能的错误原因:如果t1.Username或t2.email的形式不是@ something,那么instr将返回0.因此,left(某些字符串,0)可能是当函数离开时抛出错误,期望值> = 1作为第二个参数。

答案 1 :(得分:0)

我在查询中使用它来解决我的类似问题。

Newfield: IIf(InStrRev([pullfield],"@"),Left([pullfield],InStrRev([pullfield],"(")-1),[pullfield])

它应该在“@”符号之前拆分,如果没有“@”那么它只留下原始内容。