【问题标题】:HSQLDB ANY array function not workingHSQLDB ANY 数组函数不起作用
【发布时间】:2018-11-12 21:30:08
【问题描述】:

我有一张这样的桌子

CREATE TABLE inlist_test_table (
    id  NUMERIC(5) NOT NULL PRIMARY KEY,
    val VARCHAR(50) NOT NULL
);

我正在执行以下查询

SELECT val
FROM inlist_test_table
WHERE id = ANY(?)
ORDER BY id

使用此代码

try (var connection = this.dataSource.getConnection();
     var preparedStatement = connection.prepareStatement(this.getQuery())) {
  var array = connection.createArrayOf("smallint", new Object[] {3, 5});
  try {
    preparedStatement.setArray(1, array);

    List<String> values = new ArrayList<>(2);
    try (var resultSet = preparedStatement.executeQuery()) {
      while (resultSet.next()) {
        values.add(resultSet.getString(1));
      }
    }
    assertEquals(Arrays.asList("Value_00003", "Value_00005"), values);
  } finally {
    array.free();
  }
}

我希望返回 id 为 3 和 5 的行。相反,我得到了以下异常:

java.sql.SQLSyntaxErrorException: invalid ORDER BY expression in statement [SELECT val FROM inlist_test_table WHERE id = ANY(?) ORDER BY id]
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
    at com.github.marschall.jdbcinlists.AbstractInListTest.plainJdbc(AbstractInListTest.java:43)
    ...
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: org.hsqldb.HsqlException: invalid ORDER BY expression
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.QuerySpecification.resolveColumnReferencesInOrderBy(Unknown Source)
    at org.hsqldb.QuerySpecification.resolveColumnReferences(Unknown Source)
    at org.hsqldb.QuerySpecification.resolveReferences(Unknown Source)
    at org.hsqldb.QueryExpression.resolve(Unknown Source)
    at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
    at org.hsqldb.Session.compileStatement(Unknown Source)
    at org.hsqldb.StatementManager.compile(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
... 59 more

我正在使用 HSQLDB 2.4.1。相同的代码适用于 Postgres 和 H2。

编辑 1

SELECT val
FROM inlist_test_table
WHERE id IN ( UNNEST(?) )
ORDER BY id

不起作用,因为只有 id 为 3 的行(数组中的第一个元素)匹配,而 id 为 5 的行(数组中的第二个元素)不匹配。

编辑 2

将列类型从NUMERIC(5) 更改为int 使UNNEST 代码工作,即使数组元素类型是smallint

【问题讨论】:

  • 我相信使用HSQLDB你需要使用... WHERE id IN ( UNNEST(?) ) ...
  • 戈德的评论是正确的。请添加答案。在标准 SQL 中,ANY(...) 是一个聚合,表示任何给定的布尔值都为真。
  • @GordThompson IN ( UNNEST(?) ) 似乎不起作用,请参阅我的编辑
  • @fredt 这就是我想要的语义,应该返回 id 为 3 和 5 的行,但只返回 id 为 3 的行
  • "invalid ORDER BY expression in statement" 似乎表明存在与 IN 条件无关的问题

标签: java arrays jdbc hsqldb


【解决方案1】:

使用 HSQLDB 你需要使用

... WHERE id IN ( UNNEST(?) ) ...

从 2.4.1 版开始,当列为 NUMERIC(5) 且数组为 smallint 时,似乎存在问题。这可能会在 HSQLDB 的未来版本中得到修复。

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多