java - JDBC 查询抛出语法错误

标签 java sql postgresql jdbc

基本上,这应该做的是运行一个查询,从一列中读取所有值,然后根据这些值运行一些其他查询。它将值转换为整数的 SQL 数组,并将其作为参数传递给其他查询的语句,但是当它们执行时,它会抛出“位于或接近“$1”位置的语法错误:87”

查询示例:

"SELECT foo.id, bar.* "
+ "FROM foo, bar y "
+ "WHERE foo.baz = bar.baz and foo.id IN ? "
+ "GROUP BY foo.id";

和参数设置位(结果是列数据的数组列表):

    Integer[] data = result.toArray(new Integer[result.size()]);
    Array array = connection.createArrayOf("INTEGER", data);

    statement.clearParameters();
    statement.setArray(1, array);

(代码是通用的,因为这是作业)

最佳答案

IN 运算符需要使用括号中的表达式列表:in (1,2,3)? 占位符仅可用于单个标量值(数字、字符串)。

如果您想将 ID 列表作为数组传递,您需要更改 SQL 以便占位符“接受”数组:

SELECT foo.id, bar.*
FROM foo
  JOIN bar y ON foo.baz = bar.baz
WHERE and foo.id = ANY (?) 
GROUP BY foo.id

请注意,我还将您在 WHERE 子句中的旧式隐式连接更改为现代显式 JOIN(但这对您的问题无关紧要)。

使用上述语法,您可以传递一个包含 ID 列表的数组。

下一个问题是 "INTEGER" 在 Postgres 中不是有效的数据类型。类型名称“按原样”传递,数据类型在 Postgres 中为小写。所以你需要使用:

Array array = connection.createArrayOf("integer", data);

Basically, what this is supposed to do is run one query, read in all the values from one column, and then run some other queries based off of those values

为什么不在一条语句中做到这一点?

SELECT foo.id, bar.*
FROM foo
  JOIN bar y ON foo.baz = bar.baz
WHERE and foo.id IN (SELECT some_column FROM ...) --<< this is your "first query"
GROUP BY foo.id

这几乎总是比运行两个单独的语句要好。


不相关:

group by foo.id 似乎是不必要的,因为您不使用任何聚合函数。除非 foo.idfoo 表的主键,否则它不会工作。

关于java - JDBC 查询抛出语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716848/

相关文章:

java - G1GC 评论阶段花费的时间太长

mysql - 找出 2007 年撞车事故少于 1989 年的所有方形网格吗?

java - 线程是如何在内存中执行的?

java Servlet代理不下载某些pdf文件

java - 使用 hypejaxb 生成继承映射

sql - 优化存储过程循环以提高性能

sql - Django 查询 : how do I find the maximum time duration from start and end time fields?

python - Django 不在数据库中创建对象

database - 如何在postgres中实现全名搜索

postgresql - 对称 DS 字节阈值