2014-10-06 77 views
0

您好,感謝您閱讀我的文章。適用於字符串和Java結果集的PostgreSQL MAX聚合函數

我有一個PostgreSQL表「t」與列「c」類型是「字符變化(32)」。

此列中的值如下所示:「2014100605」。

我正在使用「MAX()」聚合函數來檢索此列中的最大值。

SELECT MAX(c) AS max FROM t; 

在Java中,如果我準備上面的查詢,得到一個 「的resultSet」 對象,並給它發送的getString( 「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); 
     } 
    } 
} 
+2

請顯示您的完整Java代碼。但總的來說:varchar列上的最大值將使用ascii排序,因此值'2'將大於'10'。問題的根本原因是您在數據庫中選擇了錯誤的數據類型。您的值看起來像日期或時間戳可疑。如果是這樣的話,可以使用'date'或'timestamp'列,所有的比較都會像你期望的那樣神奇地工作。如果這是一個普通的數字,使用'integer'。 – 2014-10-06 09:59:07

+0

我懷疑是使用'max'作爲列名的衝突 - 嘗試別的方法,比如'maxx'。 – 2014-10-06 10:01:13

+0

我試着編輯我的第一篇文章:我無法正確格式化代碼。我一直在努力幾十分鐘,這讓我瘋狂。我們不能沒有它嗎? – 2014-10-06 10:59:32

回答

0

如果你在一個唯一的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); 
}