Clojure jdbc求和的怪异响应

问题描述 投票:1回答:1

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

(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。在JDBC中sum是否有不同的对待? db(postgres)是否为sum返回不同的数据类型?

编辑3:Postgres返回总和的通用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个回答
1
投票

随着jas的提出,这是BigDecimal表示法。您可以简单地使用(double value)将BigDecimal转换为双精度-如果您确定不需要分数,甚至可以转换成很长的整数。

编辑:实际解决方案:

(extend-protocol jdbc/ISQLValue

BigDecimal
(sql-value [value] (long value)))
© www.soinside.com 2019 - 2024. All rights reserved.