我有 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);
编辑 - 让我说得更清楚
我想查询一个搜索,用户可以选择要填写的字段(其中一些字段可以保留为空)。
这样做的正确方法是什么?
最佳答案
我在这里看不到绕过条件的方法。您需要使用 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/