基本上,这应该做的是运行一个查询,读取一列中的所有值,然后根据这些值运行一些其他查询。它将值转换为整数的SQL数组,并将其作为参数传递给其他查询的语句,但是当它们执行时,会抛出“语法错误或接近”$ 1“位置:87”
查询示例:
"SELECT foo.id, bar.* "
+ "FROM foo, bar y "
+ "WHERE foo.baz = bar.baz and foo.id IN ? "
+ "GROUP BY foo.id";
参数设置位(结果是列数据的arraylist):
Integer[] data = result.toArray(new Integer[result.size()]);
Array array = connection.createArrayOf("INTEGER", data);
statement.clearParameters();
statement.setArray(1, array);
(代码是通用的,因为这是用于家庭作业)
答案 0 :(得分:3)
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中的有效数据类型。类型名称传递"按原样#34; Postgres中的数据类型为小写。所以你需要使用:
Array array = connection.createArrayOf("integer", data);
基本上,这应该做的是运行一个查询,读取一列中的所有值,然后根据这些值运行一些其他查询
为什么不在一份声明中这样做?
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.id
是foo
表的主键,否则它不会起作用。