postgresql存在检查错误,语法错误?

时间:2015-08-19 19:15:49

标签: java sql postgresql jdbc

我试图检查行是否已经存在,但是它失败并且给我一个语法错误,这就是代码:

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

2 个答案:

答案 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 + ")" "