无法在 AS400 中运行 SQL 查询,遇到 Invalid Token 错误

Posted

技术标签:

【中文标题】无法在 AS400 中运行 SQL 查询,遇到 Invalid Token 错误【英文标题】:Not able to run SQL queries in AS400, run into Invalid Token errors 【发布时间】:2013-05-16 12:46:09 【问题描述】:

在 AS400 中,我如何对字段执行算术运算(如 +、-)。

对于查询Select id, sum(field1+field2) as Total from table group by id,得到以下德语错误消息“[IBM][System i Access ODBC-Treiber][DB2 für i5/OS]SQL0104 - Token & ungültig。 Gültige 令牌:+ - AS <IDENTIFIER>。” 英文翻译是什么 像“[IBM] [System i Access ODBC 驱动程序] [DB2 for i5/OS] SQL0104 - 令牌<END Instruction> 无效。有效令牌:CL AS IN LOG OUT DATA <identifier>。” 对于查询 Select count(*) from (select distinct field1 from table where field2="abc",收到以下错误消息“[IBM][System i Access ODBC-Treiber][DB2 für i5/OS]SQL0104 - Token <ENDE DER ANWEISUNG> ungültig.Gültige Token: AS CL IN LOG OUT数据<IDENTIFIER>。” 对于带有子查询的查询得到以下错误消息 "[IBM][System i Access ODBC-Treiber][DB2 für i5/OS]SQL0104 - 令牌和 ungültig。Gültige 令牌:<> = <><=!<!>!= >= ¬< ¬> ¬= 没有。”

谁能告诉我我的 sql 查询出了什么问题。

【问题讨论】:

看起来你正在向我们展示伪代码,而查询可能有其他列名和表名。通过创建伪代码,您似乎引入了新的语法错误。请向我们展示您的实际代码,以便我们准确诊断您的实际问题 我真的很抱歉那个伪代码。此客户端数据库几乎没有敏感数据。我的查询(使用虚拟名称)如下所示“从 tbl1 中选择 EDS,sum(val(SDS)) as totalh where EDS & '' like '201305[0-9][0-9]' and siteds in(select distinct来自 tbl2 的站点,其中 ('1234') 和 PERIOD = 201305) 中的 H_04 按 EDS 顺序按 EDS 分组”。问题不在于保留关键字 Table。必须使用 & 和两个单引号 (''),因为字段 EDS 是数字类型。 【参考方案1】:

TABLE 是保留字。 SQL Reference: Reserved schema names and reserved words.

单引号转义字符串文字 双引号转义保留字(类似于 TSQL 中的括号)

SQL Reference: Identifiers

查询可以重写为:

SELECT ID, SUM(FIELD1 + FIELD2) AS TOTAL FROM "TABLE" GROUP BY ID
SELECT COUNT(*) FROM (SELECT DISTINCT FIELD1 FROM "TABLE" WHERE FIELD2 = 'ABC')

更新

DB/2 for i 不支持您的数字到字符转换方法或 LIKE 查询中使用的字符比较类型。

查询可以重写为:

SELECT eds, SUM(INT(sds)) AS totalh 
FROM tbl1 
WHERE eds BETWEEN 20130500 AND 20130599 
AND siteds IN (
    SELECT DISTINCT site 
    FROM tbl2 
    WHERE H_04 IN ('1234') AND PERIOD = 201305
) 
GROUP BY eds
ORDER BY eds

您可能需要使用DEC 而不是INT,具体取决于字段sds 的定义。

SQL 参考: - INT - DEC - BETWEEN

【讨论】:

这是发布内容的一个很好的答案。但是根据给出的通用名称和他显示的错误问题,在我看来,SQL 代码在复制错误后变成了伪代码。所以我们可能一直在关注红鲱鱼。 @James,非常感谢您的回答。我将进行修改并让客户对此进行测试。我会尽快给你更新。 @James,非常感谢您的回答。你是一个绝对的天才。它运作良好。谢谢你-Sri。【参考方案2】:

表名真的是“表”吗?

看起来很奇怪,如果我按原样使用您指定的 SQL 语句,我会得到同样的错误...但是如果我将“table”更改为“table1”,它只会抱怨它找不到“table1” '。

【讨论】:

我会说你走在正确的道路上。看来他在发布之前更改了表名。在第二个查询中,看起来他最初有类似 sum(field1 & field2) 的东西,但当他重新输入时,& 变成了 +

以上是关于无法在 AS400 中运行 SQL 查询,遇到 Invalid Token 错误的主要内容,如果未能解决你的问题,请参考以下文章

AS400 - 令牌“!”无效

AS400多成员文件SQL查询

将 PHP 连接到 IBM i (AS/400)

使用 CL As400 命令抑制文件 IO

我可以使用 sql 在 AS400 中创建“逻辑文件”吗?

直接从 Excel 中选择 AS400 查询记录