postgresql Postgres JDBC编号参数

jecbmhm3  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(131)

我在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实现吗?

lskq00tm

lskq00tm1#

不这不可能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

ecfsfe2w

ecfsfe2w2#

CTEs将所有参数都放在第一行(就像穷人的函数定义),并在查询本身中通过名称访问它们,从而使Mark的解决方案更具可读性:

WITH vars AS (SELECT ? aColumnLabel)
SELECT
  mycolumn->>vars.aColumnLabel,
  count(*)
FROM
  mytable, vars
GROUP BY
  mycolumn->>vars.aColumnLabel

字符串

相关问题