【发布时间】:2014-10-06 09:54:36
【问题描述】:
您好,感谢您阅读我的帖子。
我有一个 PostgreSQL 表“t”,其中有一列“c”,类型是“字符变化 (32)”。
此列中的值如下所示:“2014100605”。
我正在使用“MAX()”聚合函数来检索该列中的最大值。
SELECT MAX(c) AS max FROM t;
在 Java 中,如果我准备上面的查询,获取一个“resultSet”对象并将 getString("max") 消息发送给它,我会得到 max = null。
如果我改为发送 getInt("max") 方法,我会得到我期望的结果,类似于“2014100605”。
这是正常行为吗?
我真的可以这样做,还是偶然我得到了预期的结果?
“MAX()”实际上是使用字典顺序吗?
最好的问候。
一点Java代码:
s_preparedSqlQuery =
"SELECT MAX(quotinv_nro) AS quotinv_nro_max "
+ "FROM imw_quotation_invoice "
+ "WHERE quotinv_type = ? "
+ "AND quotinv_nro LIKE '" + s_quotinvDate + "%'";
preparedStatement = m_connection.prepareStatement(s_preparedSqlQuery);
preparedStatement.setString(1, s_quotinvType);
resultSet = preparedStatement.executeQuery();
if(resultSet != null)
{
if(resultSet.next())
{
// s_quotinvNroMax = resultSet.getString("quotinv_nro_max");
n_quotinvNroMax = resultSet.getInt("quotinv_nro_max");
// if(s_quotinvNroMax == null)
if(n_quotinvNroMax == 0)
{
n_nbQuotinvsThisSameDate = 0;
return n_nbQuotinvsThisSameDate;
}
else
{
s_quotinvNroMax = Integer.toString(n_quotinvNroMax);
n_length = s_quotinvDate.length();
s_currentMaxNro = s_quotinvNroMax.substring(n_length - 1);
n_nbQuotinvsThisSameDate = Integer.valueOf(s_currentMaxNro);
}
}
}
【问题讨论】:
-
请出示您的完整 Java 代码。但总的来说:varchar 列上的 max 将使用 ascii 排序,因此值
2将大于10。问题的根本原因是您在数据库中选择了错误的数据类型。您的值看起来很像日期或时间戳。如果是这种情况,请使用date或timestamp列,所有比较都会按您的预期神奇地工作。如果这是一个普通数字,请使用integer。 -
我怀疑使用
max作为列名存在名称冲突 - 请尝试其他名称,例如maxx。 -
我尝试编辑我的第一篇文章:我无法正确格式化代码。我已经尝试了数十分钟,这让我发疯了。我们不能没有它吗?
-
根据本文档:postgresql.org/docs/9.1/static/functions-aggregate.html“MAX()”聚合函数可用于以下参数类型:“任何数组、数字、字符串或日期/时间类型”。在我的例子中,“MAX()”函数的参数类型是“character varying(32)”。
-
我从来没有说过你不能在 varchar 上使用
max()。即使您的varchar列确实包含一个数字,它也会根据 characters 的比较规则运行。如果您的列中有两个字符串'2'和'10',那么max 将返回'2'。如果整数列中有两个数字:2和10,则 max 将返回10。在作为 varchar 的列上使用getInt()是另一个问题。你不应该那样做。我不确定如果字符串数据不是有效数字会发生什么。这一切似乎真的表明您为列选择了错误的数据类型。
标签: java string postgresql max aggregate-functions