SQL语句中的语法错误 - H2错误42001

13

运行此SQL语句:

select TimeInterval, 
       ((((Timer*60)/1.0)*100)/((10.0*60)/60.0)) as 'Throughput-run_1_8_11' 
from StatExternalData, StatisticDefinition 
where StatisticDefinition.ID=StatExternalData.StatDefId 
      and StatisticName='PSI_CompTran_Successful_Cnt'  
order by TimeInterval asc

我遇到了这个错误:

"select TimeInterval, ((((Timer*60)/1.0)*100)/((10.0*60)/60.0)) as 'Throughput-run_1_8_11'[*] from StatExternalData, StatisticDefinition where StatisticDefinition.ID=StatExternalData.StatDefId and StatisticName='PSI_CompTran_Successful_Cnt'  order by TimeInterval asc"; 
expected "identifier"; [42001-185]

我已经弄清楚[*]表示哪部分陈述是不正确的,而H2错误代码42001表示SQL语句无效,但我已经努力了几周,仍然想不出问题出在哪里。有没有人有什么想法?


1
你尝试过用双引号 " " 而不是单引号 (' ') 将列别名括起来吗? - Barranka
另外,请尝试避免使用破折号“-”。请使用**Throughput_run_1_8_11**代替Throughput-run_1_8_11 - Barranka
4
"Throughput-run_1_8_11" 这个格式是无效的 SQL。单引号用于字符串字面值,双引号用于标识符。 - user330315
谢谢barranka和a_horse_with_no_name,问题已解决! - SnoBro
6个回答

3
我有同样的问题:
我的实体看起来像这样:
@Entity
public class ShopCommentRating {

@NotNull
private Boolean like;

}

查询结果包含一个[*]。
为了消除错误,我不得不将字段名称更改为像这样的内容:
@Entity
public class ShopCommentRating {

@NotNull
private Boolean commentLike;

}

小驼峰命名法

在你的情况下,“like”是保留的SQL关键词。其他名称都可以使用。 - Dmytro Maslenko
如果你真的必须使用保留关键字作为列名(虽然我不建议这样做),你也可以转义列名。 - Jacob van Lingen
救了我!!!现在value字段也被H2数据库保留了。 - Marcello DeSales

2
没人好奇在 [42001-185] 中的 185 是什么意思。 42001public static final int SYNTAX_ERROR_2 = 42001; 源代码
根据 h2 源码,185 是 SQL 错误位置,但对我来说它看起来很误导,因为实际上它是行和行内符号的组合。
185 -> means 1-row and 85-symbol.

1
你提到的'185'代码似乎不是真实存在的。它只是构建号。在链接的文件顶部,它说: “在SQL语句中有语法错误”SELECT * FORM[*] TEST";
  • SQL语句:select * form test [42000-125]
  • [*]标记语法错误的位置 *(这种情况下应该是FROM而不是FORM)。 *错误代码为42000,构建号为125, *表示版本1.2.125。
- Gonan

1

我通过重命名我的实体来解决了这种ErrorCode的问题。看起来,某些名称被解释为查询命令 -.-


1

请查看H2的SQL语法页面。在我的情况下,问题是表名为'order'和破折号('-'),而不是下划线('_')。愚蠢但致命。

在您的查询中,别名'Throughput-run_1_8_11'的破折号可能会成为问题。


0

针对42001-197错误,您还可以检查Oracle分析函数和H2版本,它需要从1.4.198版本开始,特别是针对ROW_NUMBER OVER PARTITION。


0
我在使用Hibernate(6.2.5.Final)初始化我的H2数据库(2.1.214)时,出现了一个问题,令人惊讶的是,'year'列的命名导致了问题。将其改为'releaseYear'后,问题得到解决。
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000a    create table book (\000a        id bigint not null,\000a        supply_date timestamp(6),\000a        author varchar(255) not null,\000a        title varchar(255) not null,\000a        [*]year varchar(255) not null,\000a        primary key (id)\000a    )"; expected "identifier"; SQL statement:

create table book (
    id bigint not null,
    supply_date timestamp(6),
    author varchar(255) not null,
    title varchar(255) not null,
    year varchar(255) not null,
    primary key (id)
) [42001-214]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接