【问题标题】:Postgres JDBC Numbered ParametersPostgres JDBC 编号参数
【发布时间】:2014-11-15 09:04:52
【问题描述】:

我在 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 可以做到这一点吗?

【问题讨论】:

    标签: postgresql jdbc


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 2018-04-14
      相关资源
      最近更新 更多