gpt4 book ai didi

java - 使用 jooq 将 COUNT 值除以另一个值时出现舍入问题

转载 作者:行者123 更新时间:2023-11-30 10:07:43 24 4
gpt4 key购买 nike

当使用 SQL 时,我可以运行一个简单的查询,例如下面的查询,没有问题,它返回一个小数点后 4 位的答案:

SELECT(COUNT(ID)/7) FROM myTable;

如果上面的计数返回值为 12,则在工作台中返回的选择值为 1.7143。

当我使用 jooq 进行此计算时出现问题:

dsl.select(count(MYTABLE.ID).divide(7).from(MYTABLE).fetch();

上面的代码返回值 1,而我想要的值是 1.7143。

我有类似的 jooq 代码行,它们使用 SUM 而不是 COUNT,它们返回一个小数点后 4 位的值,但我找不到一种方法让上面的代码将值返回到小数点后 4 位。

我试过使用 .round 但没有成功。

有没有其他人遇到过类似的问题并且知道解决方案?

最佳答案

这里有两个问题,具体取决于您使用的 RDBMS:

1。整个投影表达式的类型

整个除法表达式的类型取决于左侧(被除数)的类型,即 SQLDataType.INTEGER .因此,无论您的 RDBMS 返回的是小数还是 float ,jOOQ 都将使用 JDBC 的 ResultSet.getInt()。获取值的方法,您将失去精度。因此,第一步是确保 jOOQ 将获取所需的数据类型。有几种方法可以做到这一点:

  1. COUNT(*) 表达式使用强制转换:count(MYTABLE.ID).cast(SQLDataType.DOUBLE).divide(7)
  2. 对整个表达式使用强制转换:count(MYTABLE.ID).divide(7).cast(SQLDataType.DOUBLE)
  3. 使用data type coercion在任一表达式上:expr.coerce(SQLDataType.DOUBLE)

转换对生成的 SQL 有影响。数据类型强制不是。

2。 RDBMS 如何处理数据类型

在大多数 RDBMS 中,count(*) 表达式产生一个整数类型,而你的除法右侧(除数)也是一个整数,所以最好的结果数据类型实际上是一个整数类型。我怀疑您应该传递 doubleBigDecimal 类型作为除数。

解决方案

理想的解决方案是结合以上两者:

dsl.select(count(MYTABLE.ID).cast(SQLDataType.DOUBLE).divide(7.0))
.from(MYTABLE)
.fetch();

关于java - 使用 jooq 将 COUNT 值除以另一个值时出现舍入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54113944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com