【问题标题】:PostgreSQL MAX aggregate function applied to strings and Java resultsetPostgreSQL MAX 聚合函数应用于字符串和 Java 结果集
【发布时间】: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。问题的根本原因是您在数据库中选择了错误的数据类型。您的值看起来很像日期或时间戳。如果是这种情况,请使用datetimestamp 列,所有比较都会按您的预期神奇地工作。如果这是一个普通数字,请使用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'。如果整数列中有两个数字:210,则 max 将返回 10。在作为 varchar 的列上使用 getInt() 是另一个问题。你不应该那样做。我不确定如果字符串数据不是有效数字会发生什么。这一切似乎真的表明您为列选择了错误的数据类型。

标签: java string postgresql max aggregate-functions


【解决方案1】:

如果您正在点击一个唯一的 Id 列....

int maxID = 0;
Statement s2 = con.createStatement();
s2.execute("SELECT MAX(UniqueId) FROM MyTable");    
ResultSet rs2 = s2.getResultSet(); 

if (rs2.next()) 
{
  maxID = rs2.getInt(1);
}

如果您正在点击任何其他非关键列....

int maxID = 0;
Statement s2 = con.createStatement();
s2.execute("SELECT MAX(ColumnValue) FROM MyTable");    
ResultSet rs2 = s2.getResultSet(); 

while (rs2.next()) 
{
  maxID = rs2.getInt(1);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2015-05-19
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多