PostgreSQL中查询条件字段为空时如何返回所有匹配行?
动态可选条件SQL实现方案
方案1:SQL内置空值判断(无需动态拼接)
直接调整查询语句的WHERE条件,对每个可选参数增加空值判断分支:
SELECT * FROM users WHERE (:name IS NULL OR name = :name) AND (:class IS NULL OR class = :class)
逻辑说明:当参数值为null时,参数 IS NULL的判断成立,整个对应条件返回true,不会对该字段做过滤,等同于返回该列所有记录;参数非空时才会执行等值匹配。
注意需要将所有用到的参数都显式加入参数源,值为null也要添加:
MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("name", request.params.name); // class参数即使为null也需要显式传入 params.addValue("class", request.params.class); // 执行查询即可正常返回结果
方案2:动态拼接SQL(性能更优)
如果可选参数较多,第一种方案的SQL会有冗余条件,可根据参数是否非空动态拼接WHERE子句:
StringBuilder sqlBuilder = new StringBuilder("SELECT * FROM users WHERE 1=1"); MapSqlParameterSource params = new MapSqlParameterSource(); // name非空时才添加对应查询条件 if (request.params.name != null) { sqlBuilder.append(" AND name = :name"); params.addValue("name", request.params.name); } // class非空时才添加对应查询条件 if (request.params.class != null) { sqlBuilder.append(" AND class = :class"); params.addValue("class", request.params.class); } // 使用拼接完成的SQL语句执行查询 String runSql = sqlBuilder.toString();
该方案生成的SQL更简洁,执行效率更高,适合可选参数数量多的场景。
内容的提问来源于stack exchange,提问作者rudeTool
相关产品推荐
相关产品推荐

