在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));
答案 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])
它应该在“@”符号之前拆分,如果没有“@”那么它只留下原始内容。