【问题标题】:Syntax Error(missing operator) in query expression - MS-Access查询表达式中的语法错误(缺少运算符) - MS-Access
【发布时间】:2010-12-19 23:39:30
【问题描述】:

这不会产生语法错误,但会给出错误的参数错误:

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;

有什么解决方法吗?

感谢您的回复。

【问题讨论】:

  • 我可以建议您给您的表格一个短(1 个字母)别名,并更新您的问题吗?我认为这会使它更具可读性。
  • 您提到“错误的参数错误”。你能指定错误吗?这通常发生在某个字段拼写错误时。
  • @iDevlop 它说“查询表达式中函数使用的参数数量错误'left(...”

标签: ms-access syntax operator-keyword


【解决方案1】:

将该逻辑放入 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;

【讨论】:

  • 不适合我。我对VB不太好。我希望坚持使用 sql。
  • VBA 环境在告诉您语法错误在哪里方面做得更好。并且执行您在此处执行的操作的 VBA 比您构建的 SQL 语句要简单得多。但各有各的。如果我必须使用 SQL 执行此操作,那么我将使用 LIKE 而不是 InStr([aname] LIKE "* *" 将给出与InStr([aname], " ") > 0 相同的结果)。我在编辑您的查询时玩了一下,我认为您可能只需要确保到处都有括号。请参阅新编辑的答案以获取建议。
【解决方案2】:

第 10 行

right(

没有对应的右括号

【讨论】:

【解决方案3】:

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),

【讨论】:

    【解决方案4】:
     IIF(instr([aname], " " = 0 AND instr([aname], ",") = 0,
    

    第 12 行应该是

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

    【讨论】:

    • 它仍然给出错误“Missing ), ], or Item in query expression"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2019-07-18
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多