java - 当变量可以为空时查询表

标签 java sql

我有 3 个变量,其值由用户插入。

我需要查询一个包含 3 列的表,如果其中一个变量为 null,则不执行查询。

如何在没有 if-else 的情况下做到这一点?

String par1= request.getParameter("par1");
String par2= request.getParameter("par2");
String par3= request.getParameter("par3 ");

String query = "select * from table t " +
                "where t.var1 = ? " + 
                    "and t.var2" +
                    "and t.var3= ? ";

Connection conn = DataBase.getConnection();
PreparedStatement s = conn.prepareStatement(query);
s.setString(1, par1);
s.setString(2, par2);
s.setString(3, par3);

编辑 - 让我说得更清楚

no

我想查询一个搜索,用户可以选择要填写的字段(其中一些字段可以保留为空)。

这样做的正确方法是什么?

最佳答案

我在这里看不到绕过条件的方法。您需要使用 StringBuilder 以及 if-else block 在此处动态构建 SELECT 查询。

String par1 = "par1"; // intialized for testing
String par2 = null;
String par3 = "par3";

StringBuilder query = new StringBuilder("select * from table t");

if (par1 != null || par2 != null || par3 != null) {
    query.append(" where ");
    if (par1 != null) {
        query.append("t.var1 = ?");
    }
    if (par2 != null) {
        if (par1 != null) {
            query.append(" AND ");
        }
        query.append("t.var2 = ?");
    }
    if (par3 != null) {
        if (par1 != null || par2 != null) {
            query.append(" AND ");
        }
        query.append("t.var3 = ?");
    }
}

System.out.println(query);

输出:

select * from table t where t.var1 = ? AND t.var3 = ?

请注意,您还必须有条件地绑定(bind)占位符值。

Connection conn = DataBase.getConnection();
PreparedStatement s = conn.prepareStatement(query.toString());

if (par1 != null || par2 != null || par3 != null) {
    int n = 1;
    if (par1 != null) {
        s.setString(n++, par1);
    }
    if (par2 != null) {
        s.setString(n++, par2);
    }
    if (par3 != null) {
        s.setString(n, par3);
    }
}

关于java - 当变量可以为空时查询表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19160681/

相关文章:

java - 如何使 spring boot 嵌入式 tomcat 为基本 url 返回 200 OK?

mysql - 删除重复的行,但保留一个没有唯一列的行

mysql - 如何在 WHERE 的子句下实现 IF ELSE?

php - 如何在新表中记录 MySQL 查询

java无法从文件中读取一行

java - 如何解决这个逻辑错误(初学者)?

java - 可以使用 Jackson 从内部 json 对象获取字段吗?

java - Android Room Sqlite 没有这样的列,而不是在 WHERE 条件下使用等号 (=)

mysql - SQL 替换值通配符

sql - 根据当前行和下一行对行求和