【问题标题】:Clojure jdbc weird response for sumClojure jdbc对sum的奇怪响应
【发布时间】:2019-10-31 09:49:42
【问题描述】:

我正在尝试执行两个计数查询的简单求和聚合:

(jdbc/query (db-connection)
        "SELECT sum(t.count) AS count FROM (select 1 AS count union select 2 AS count) t")
=> ({:count 3})

(jdbc/query (db-connection)
        "select count(1) from table_a")
=> ({:count 0})

(jdbc/query (db-connection)
        "select count(1) from table_b")
=> ({:count 0})

(jdbc/query (db-connection)
        "SELECT sum(t.count) AS count FROM (select count(1) from table_a union select count(1) from table_b) t")
=> ({:count 0M})

0M

为什么是 0M?为什么是M?怎么回事?

EDIT2:这是 BigDecimal 表示法。我仍然想知道为什么它突然使用 BigDecimal。 sum 在 JDBC 中的处理方式不同吗? db (postgres) 是否为 sum 返回不同的数据类型?

编辑 3:Postgres 为 sum 聚合返回通用的 numeric 类型。这在 JDBC 中被转换为 BigDecimal。

因此,另一种持续获得相同类型返回值的方法是在查询中进行强制转换:

(jdbc/query (db-connection)
    "SELECT sum(t.count)::bigint AS count FROM (select count(1) from table_a union select count(1) from table_b) t")
=> ({:count 423602})

【问题讨论】:

标签: jdbc clojure


【解决方案1】:

正如 jas 提出的,这是 BigDecimal 表示法。您可以简单地使用 (double value) 将 BigDecimal 转换为 double - 如果您确定不需要分数,甚至可以转换为 long。

编辑:实际解决方案:

(extend-protocol jdbc/ISQLValue

BigDecimal
(sql-value [value] (long value)))

【讨论】:

  • 请记住,如果值真的不适合 long,这可能会引发异常
  • 好点。在我的情况下,总和总是以万计,数据大小增长非常缓慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 2011-03-27
  • 2020-08-10
相关资源
最近更新 更多