我正在尝试执行两个计数查询的简单总和:
(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})
随着jas的提出,这是BigDecimal表示法。您可以简单地使用(double value)
将BigDecimal转换为双精度-如果您确定不需要分数,甚至可以转换成很长的整数。
编辑:实际解决方案:
(extend-protocol jdbc/ISQLValue
BigDecimal
(sql-value [value] (long value)))