Clojure jdbc对sum的奇怪响应
Im正在尝试执行两个计数查询的简单总和聚合:Clojure jdbc对sum的奇怪响应,jdbc,clojure,Jdbc,Clojure,Im正在尝试执行两个计数查询的简单总和聚合: (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 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})
0米
为什么?为什么是我?发生了什么事
编辑2:这是大十进制表示法。我仍然想知道为什么它突然使用BigDecimal。在JDBC中,sum
的处理方式是否不同?db(postgres)是否为sum
返回不同的数据类型
编辑3:Postgres返回总和聚合的通用<代码>数值代码>类型。这在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})
正如jas提到的,这是大十进制记数法。只要使用
(double value)
,您就可以将BigDecimal转换为double,如果您确定不需要分数,甚至可以转换为long
编辑:实际解决方案:
(extend-protocol jdbc/ISQLValue
BigDecimal
(sql-value [value] (long value)))
我不会说这是重复的,但它可能会有所帮助:请记住,如果该值真的不符合一个良好的点,那么这可能会引发异常。在我的例子中,总和总是以数万为单位,数据量增长非常缓慢。