网页中列出了3个查询条件,包括【id】、【姓名】和【性别】,每个条件都可输入,当某个条件没有输入值的时候表示不考虑此条件,全空则是检索全部。
例如:搜索id=1,姓名=Marno,性别=男,则要执行
SELECT * FROM TABLE
WHERE id = 2
AND Name LIKE
AND SEX =
例如:搜索id=2,性别=男,则要执行
SELECT * FROM TABLE
WHERE id =
AND SEX
例如:全空时候表示不考虑这些条件,则只要执行
SELECT * FROM TABLE
可以明显看出,如果只是少了一两个条件,只要一个判断条件值是否为空即可,若不为空则向后加条件。但是没有条件和条件之间有一个WHERE字段,也就是需要额外的判断语句。
解决办法是在基础语句后面增加WHERE 1 = 1,也就是
SELECT * FROM TABLE WHERE 1 = 1
此时where后面的条件永真,看上去是条件搜索的语句实际上还是在搜索全部记录,而后面的操作也是非常简单了:
String sql = "SELECT * FROM TABLE WHERE 1=1";
if(id != null) {
sql.appendLine("AND id = " + id + ");
} ;
if(name != null) {
sql.appendLine("AND NAME LIKE = " + name +");
} ;
if(sex != null) {
sql.appendLine("AND SEX =");
} ;
executeSQL(sql);
然而!这种做法虽然方便了代码,但是麻烦了数据库,在使用添加了WHERE 1 = 1的过滤条件以后傻傻的数据库系统看到了WHERE就以为要对每条数据都进行扫描,再判断此行是否满足【1 = 1】,因此无法使用索引等查询优化策略,当表中数据量较大时查询速度会大大减慢。因此这时还是老老实实的,麻烦代码兄弟照顾一下SQL弟弟吧:
private void DoQuery() {
Bool hasWhere = false; //判断是否需要WHERE
String sql = "SELECT * FROM TABLE";
if(id != null) {
hasWhere = appendWhereIfNeed(sql, hasWhere);
sql.appendLine("AND id = " + id + ");
} ;
if(name != null) {
sql.appendLine("AND NAME LIKE = " + name +");
} ;
if(sex != null) {
sql.appendLine("AND SEX =");
} ;
executeSQL(sql);
}
private Bool appendWhereIfNeed(StringBuilder sql,Bool hasWhere) {
if(hasWhere==false) {
sql. appendLine("WHERE");
} else {
sql. appendLine("AND");
}
}
博客探讨了在网页中进行SQL多条件查询时如何处理空条件的问题。通过示例展示了不同搜索条件组合下SQL语句的构建,并指出当条件为空时,`1 = 1`的条件会导致数据库无法使用索引优化,降低查询效率。文章提出了优化建议,强调在数据量大时应避免这种做法,而考虑使用Mybatis等框架来更好地处理动态查询。
2168

被折叠的 条评论
为什么被折叠?



