我在Postgres 9.3数据库中有一个表,其中包含一个json列:
CREATE mytable (
mycolumn json
)
我想从Java应用程序执行如下所示的查询:
SELECT
mycolumn->>'somefield',
count(*)
FROM
mytable
GROUP BY
mycolumn->>'somefield'
当我尝试使用像这样的PreparedStatement:
SELECT
mycolumn->>?,
count(*)
FROM
mytable
GROUP BY
mycolumn->>?
我收到以下错误:
PSQLException: ERROR: column "mytable.mycolumn" must appear in the GROUP BY clause or be used in an aggregate function
这是有道理的,因为Postgres不能保证两个位置参数是相同的。
使用psql,我可以准备一个这样的语句:
PREPARE mystatement AS
SELECT
mycolumn->>$1,
count(*)
FROM
mytable
GROUP BY
mycolumn->>$1
是否可以使用JDBC执行此操作?
答案 0 :(得分:1)
不,这是不可能的。 JDBC只有位置参数,因此PostgreSQL驱动程序将其呈现为:
PREPARE mystatement AS
SELECT
mycolumn->>$1,
count(*)
FROM
mytable
GROUP BY
mycolumn->>$2
由于$1
的值不一定与$2
相同,PostgreSQL的解析器会拒绝它,因为您可能没有在同一列上进行分组。
解决方案可能是:
SELECT a.aColumnLabel, count(*)
FROM (
SELECT mycolumn->>? as aColumnLabel
FROM mytable
) a
GROUP BY a.aColumnLabel