2015-11-23 111 views
0

我有查詢必須返回一個布爾值,但我總是得到相同的結果。我曾經嘗試這樣做:PostgreSQL查詢總是返回true

boolean exist=stmt.execute("select exists(select 1 from calcul where 
to_char(date, 'YYYY-MM')=to_char("+dates+", 'YYYY-MM') AND 
idproduit="+codeP+" AND ppa="+PPA+" AND tr="+TR+" AND net="+NET+" AND 
dateper='"+datePer+"')"); 

結果總是true,從不false;爲什麼?

+2

的'='的標誌是分配標誌,而'=='是一個比較符號。 –

+0

請使用'PreparedStatement',不要像這樣連接SQL查詢。您還需要使用'executeQuery()',如JavaDocs中清楚記錄的那樣 –

回答

1

看看在JavaDocs for Statement#execute(String)

返回:
true如果第一個結果是ResultSet對象; false如果 是更新計數或者不存在任何結果

你可以使用Statement#executeQuery(String)將返回一個ResultSet,從中你一定要去檢查的第一行

喜歡的東西的結果。 ...

try (Statement stmt = con.createStatement()) { 
    try (ResultSet rs = stmt.executeQuery("select exists(select 1 from calcul where to_char(date, 'YYYY-MM')=to_char("+dates+", 'YYYY-MM') AND idproduit="+codeP+" AND ppa="+PPA+" AND tr="+TR+" AND net="+NET+" AND dateper='"+datePer+"')")) { 
     if (rs.next()) { 
      boolean exists = rs.getBoolean(1); 
     } 
    } 
} catch (SQLException exp) { 
    exp.printStackTrace(); 
} 

例如。

話雖如此,我會強烈建議您使用PreparedStatement,看到Using Prepared Statements更多細節

例如...

try (PreparedStatement stmt = con.prepareStatement("select exists(select 1 from calcul where to_char(date, 'YYYY-MM')=to_char(?, 'YYYY-MM') AND idproduit=? AND ppa=? AND tr=? AND net=? AND dateper='?')")) { 
    stmt.setString(1, dates); 
    stmt.setString(2, codeP); 
    stmt.setString(3, PPA); 
    stmt.setString(4, TR); 
    stmt.setString(5, NET); 
    stmt.setString(6, datePer); 
    try (ResultSet rs = stmt.executeQuery()) { 
     if (rs.next()) { 
      boolean exists = rs.getBoolean(1); 
     } 
    } 
} catch (SQLException exp) { 
    exp.printStackTrace(); 
} 
2

true只是意味着有一個結果,如在execute()的Javadoc指出:

返回:
真如果第一結果爲ResultSet對象;如果第一個結果是更新計數或沒有結果,則爲false。

您需要撥打getResultSet()才能得到實際結果。