我试图检查行是否已经存在,但是它失败并且给我一个语法错误,这就是代码:
ArrayList of Item
查询:
public boolean checkExist(String table, String info) {
try {
PreparedStatement st = con.prepareStatement("SELECT EXISTS(SELECT 1 FROM " + table + " WHERE info=" + info + ")");
return st.execute();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
抛出:org.postgresql.util.PSQLException:错误:语法错误在或附近")" 位置:104
答案 0 :(得分:2)
您的查询的问题在于您将info
的值附加到查询文字中,但不会将其包装在PostgreSQL中所需的单引号中。因此,发送到数据库的查询变为类似
SELECT EXISTS(SELECT 1 FROM myTable WHERE info=valueOfInfo)
而不是
SELECT EXISTS(SELECT 1 FROM myTable WHERE info='valueOfInfo')
执行此操作的正确方法是将绑定变量与PreparedStatement
一起使用,并且在查询文字中只有占位符(?
)。这样,您不必担心将变量包装在引号中,或者更重要的是,可能需要SQL注入。
此外,您应该在使用后关闭声明;这是try-with-resources statement最简单的方法(假设您使用的是Java 7或更高版本)。因此,您的方法的固定版本可能如下所示:
public boolean checkExist(String table, String info) {
final String query = "SELECT EXISTS(SELECT 1 FROM " + table
+ " WHERE info = ?)";
try (PreparedStatement st = con.prepareStatement(query,
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)) {
st.setString(1, info); // bind the variable to the placeholder
try (ResultSet rs = st.executeQuery()) {
if (rs.next()) {
return rs.getBoolean(1); // EXISTS() returns a boolean
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
答案 1 :(得分:1)
你应该真的这样做
" SELECT 1 FROM " + table + " WHERE info=" + info + ")" "
当存在与1
子句匹配的行时,这将返回where
。
另外,如果您只需要返回distinct
,请使用1
,无论有多少行符合where
条件,例如
" SELECT distinct 1 FROM " + table + " WHERE info=" + info + ")" "