2010-12-19 113 views
0

这不会产生语法错误,但它给出错误的参数错误:语法错误(缺少操作员)在查询表达式 - MS-访问

SELECT left(
    [aname], 
IIF(instr([aname], " ") = 0 AND instr([aname], ",") = 0, 
    Len(FinalForgotten.aname), 
    IIF(instr([aname], ",") = 0, 
    InStr(1,[aname]," ")-1, 
    InStr(1,[aname],",")-1))) 
& "," & 

right(
    [aname], 
IIF(instr([aname], " " = 0 AND instr([aname], ",") = 0, 
    Len(FinalForgotten.aname), 
    IIF(instr([aname], ",") = 0, 
     Len(aname)-InStr(1,[aname]," "), 
     Len(aname)-InStr(1,[aname],","))))) 
& " " & 

defense_final.middle_initial AS fullname INTO FinalForgottenWithMiddle 
FROM FinalForgotten INNER JOIN defense_final ON (right(FinalForgotten.aname, 
IIF(instr([aname], ",") = 0, 
Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname]," "), 
Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname],",") 
) 
)=defense_final.first_name) AND (left(FinalForgotten.aname, 
IIF(instr([aname], ",") = 0, 
    InStr(1,FinalForgotten.[aname]," ")-1, 
    InStr(1,FinalForgotten.[aname],",")-1 
    ) 
)=defense_final.last_name); 

因此增加额外的参数我现在得到语法错误“失踪) ,]或查询表达式中的项目“:

SELECT left(
    [aname], 
IIF(instr([aname], " ") = 0 AND instr([aname], ",") = 0, 
    Len(FinalForgotten.aname), 
    IIF(instr([aname], ",") = 0, 
    InStr(1,[aname]," ")-1, 
    InStr(1,[aname],",")-1))) 
& "," & 

right(
    [aname], 
IIF(instr([aname], " ") = 0 AND instr([aname], ",") = 0, 
    Len(FinalForgotten.aname), 
    IIF(instr([aname], ",") = 0, 
     Len(aname)-InStr(1,[aname]," "), 
     Len(aname)-InStr(1,[aname],",")))) 
& " " & 

defense_final.middle_initial AS fullname INTO FinalForgottenWithMiddle 
FROM FinalForgotten INNER JOIN defense_final ON 

left(FinalForgotten.aname, 
    IIF(instr([aname], " ") = 0 AND instr([aname], ",") = 0, 
     Len(FinalForgotten.aname), 
     IIF(instr([aname], ",") = 0, 
     InStr(1,FinalForgotten.[aname]," ")-1, 
     InStr(1,FinalForgotten.[aname],",")-1))) 

=defense_final.last_name AND 

right(FinalForgotten.aname, 
     IIF(instr([aname], " ") = 0 AND instr([aname], ",") = 0, 
     Len(FinalForgotten.aname), 
     IIF(instr([aname], ",") = 0, 
     Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname]," "), 
     Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname],",")))) 

=defense_final.first_name; 

任何解决方法?

感谢您的回复。

+0

may I s你最好给你的表一个简短的(1个字母)别名,并更新你的问题?这会让我觉得它更具可读性。 – 2010-12-20 14:41:55

+0

你提到“错误的参数错误”。你能指定错误吗?通常情况下,当字段拼写错误时。 – 2010-12-20 14:47:20

+0

@iDevlop它说:“在查询表达式中使用的函数参数的错误数量”左(...“ – JohnMerlino 2010-12-20 15:08:30

回答

0

它会更容易把这种逻辑到VBA功能,使您的查询看起来像这样

SELECT GetFullNameWithMiddle([aname]) AS fullname 
INTO FinalForgottenWithMiddle 
FROM FinalForgotten INNER JOIN defense_final 
    ON GetLastName([aname])=defense_final.last_name 
    AND GetFirstName([aname])=defense_final.first_name 

由于你说你不想使用VBA,试试这个。我封闭每

InStr(x, y) = 0 
括号

,所以

IIf(InStr(x, y) = 0 AND InStr(p, q) = 0, g, h) 

成为

IIf((InStr(x, y) = 0) AND (InStr(p, q) = 0), g, h) 

做出这样的转变让我切换到查询设计网格,这意味着SQL解析器喜欢它:

SELECT left(
    [aname], 
    IIF((instr([aname], " ") = 0) AND (instr([aname], ",") = 0), 
    Len(FinalForgotten.aname), 
    IIF((instr([aname], ",") = 0), 
    InStr(1,[aname]," ")-1, 
    InStr(1,[aname],",")-1))) 

    & "," & 

right(
    [aname], 
    IIF((instr([aname], " ") = 0) AND (instr([aname], ",") = 0), 
    Len(FinalForgotten.aname), 
    IIF((instr([aname], ",") = 0), 
     Len(aname)-InStr(1,[aname]," "), 
     Len(aname)-InStr(1,[aname],",")))) 

    & " " & 

defense_final.middle_initial AS fullname INTO FinalForgottenWithMiddle 
FROM FinalForgotten INNER JOIN defense_final ON 

left(FinalForgotten.aname, 
    IIF((instr([aname], " ") = 0) AND (instr([aname], ",") = 0), 
    Len(FinalForgotten.aname), 
    IIF((instr([aname], ",") = 0), 
    InStr(1,FinalForgotten.[aname]," ")-1, 
    InStr(1,FinalForgotten.[aname],",")-1))) 

=defense_final.last_name AND 

right(FinalForgotten.aname, 
    IIF((instr([aname], " ") = 0) AND (instr([aname], ",") = 0), 
    Len(FinalForgotten.aname), 
    IIF((instr([aname], ",") = 0), 
    Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname]," "), 
    Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname],",")))) 

=defense_final.first_name; 
+0

不适合我。我不太擅长VB。我希望坚持与SQL。 – JohnMerlino 2010-12-20 23:19:13

+0

VBA环境在告诉你语法错误在哪里做得更好。而VBA做你在这里做的事情要比你构建的SQL语句简单得多。但每一个都是他自己的。如果我必须用SQL来做,那么我会使用LIKE而不是InStr('[aname] LIKE“* *”'会得到与InStr([aname],“”)> 0')相同的结果。我在编辑时查询了一下你的查询,我想你可能只需要确保你到处都有括号。查看新编辑的答案以获取建议。 – phoog 2010-12-20 23:41:42

0

线10

right(

没有相应的右括号

+0

感谢您的回复,但我添加了一个右括号,但然后得到一个语法错误,指出”Missing“,]或Item in查询表达式“并将光标置于第一个AND上。 – JohnMerlino 2010-12-20 02:28:02

0

SELECT left([aname], 所以[aname]是一个文本字段。

IIF(instr([aname], " ") = 0 AND instr([aname], ",") = 0, 

如果这个条件为真,你想向左字符串的长度为:

FinalForgotten.aname, 

这是不是一个整数。你想:

SELECT left(
    [aname], 
IIF(instr([aname], " ") = 0 AND instr([aname], ",") = 0, 
    Len(FinalForgotten.aname), 
+0

这是测试?对我来说,它仍然会有同样的错误。 – JohnMerlino 2010-12-20 13:36:57

0
IIF(instr([aname], " " = 0 AND instr([aname], ",") = 0, 

第12行应该是

IIF(instr([aname], " ") = 0 AND instr([aname], ",") = 0, 
+0

它仍然给出错误“Missing”,]或Item中的查询表达式“ – JohnMerlino 2010-12-20 16:21:59

相关问题