gpt4 book ai didi

java - JDBC 查询抛出语法错误

转载 作者:行者123 更新时间:2023-11-29 14:19:41 24 4
gpt4 key购买 nike

基本上,这应该做的是运行一个查询,从一列中读取所有值,然后根据这些值运行一些其他查询。它将值转换为整数的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com