Sql动态查询拼接字符串的优化

最原始的 直接写:string sql="select * from TestTables where 1=1";
... 这样的代码效率很低的,这样影响了数据库的索引引用
如下所示:
private void TestOneMethod()
        { 
            string querySql = "select * from TestTables where 1=1";
            if (hasOneCondition)
            {
                querySql += "oneCondition='oneCondition'";
            }
            if (hasTwoCondition)
            {
                querySql += "twoCondition='twoCondition'";
            }
            if (hasThreeCondition)
            {
                querySql +=  "threeCondition='threeCondition'";
            }
            // ....其他条件
            // ExcSql(querySql)
        }

优化方案A:
去掉 string sql="where 1=1"
那么,在用的时候定义一个变量,用来标志是否应存在了hasWhere=false ,如果已经存在了则 hasWhere=!hasWhere.这样下一次在用的时候就

可以用下面的形式表示了:
private void TestOneMethod()
        { 
            string querySql = "select * from TestTables";
            bool _hasWhere = false;
            if (hasOneCondition)
            {
                querySql += _hasWhere ? "where" : "and" + "oneCondition='oneCondition'";
                _hasWhere = true;
            }
            if (hasTwoCondition)
            {
                querySql += _hasWhere ? "where" : "and" + "twoCondition='twoCondition'";
                _hasWhere = true;
            }
            if (hasThreeCondition)
            {
                querySql += _hasWhere ? "where" : "and" + "threeCondition='threeCondition'";
                _hasWhere = true;
            }
            // ....其他条件
            // ExcSql(querySql)
        }
....

经过优化后,sql的效率提高了,但是仍然存在问题,问题在哪里呢?如果我们每次都这样写的话是不是非常的费力,那么就提出一个通用的方

法,这个通用的方法首先得有一个bool类型的返回值,用来确认当前是否需要hasString。如下,在应用的时候:

private bool SeachHelper(string whereString, bool hasWhere)
        {
            if (!hasWhere)
                whereString = "where" + whereString;
            else
                whereString = "and" + whereString;
            return true;
        }

private void TestTwoMethod()
        {
            string querySql = "select * from TestTables";
            bool _hasWhere = false;
            if (hasOneCondition)
            {
                _hasWhere = SeachHelper(querySql, _hasWhere);
                querySql += "oneCondition='oneCondition'";
            }
            if (hasThreeCondition)
            {
                _hasWhere = SeachHelper(querySql, _hasWhere);
                querySql += "twoCondition='twoCondition'";
            }
            if (hasThreeCondition)
            {
                _hasWhere = SeachHelper(querySql, _hasWhere);
                querySql += "threeCondition='threeCondition'";
            }
            // ....其他条件
            // ExcSql(querySql);
        }

代码简洁了不少,但是仍然粗只能问题,那么问题又是什么呢?
额,字符串来回的拼接非常的浪费资源,那么 ,用StringBuilder啊,好接下来继续。

private void TestThreeMethod()
        {
            StringBuilder querySql = new StringBuilder();
            querySql.Append("select * from TestTables");
            bool _hasWhere = false;
            if (hasOneCondition)
            {
                _hasWhere = SeachHelper(querySql, _hasWhere);
                querySql.Append("oneCondition='oneCondition'");
            }
            if (hasThreeCondition)
            {
                _hasWhere = SeachHelper(querySql, _hasWhere);
                querySql.Append("twoCondition='twoCondition'");
            }
            if (hasThreeCondition)
            {
                _hasWhere = SeachHelper(querySql, _hasWhere);
                querySql.Append("threeCondition='threeCondition'");
            }
            // ....其他条件
            // ExcSql(querySql.ToString());
        }

等一下,那个公用的方法也得改,当然要改!
 
        private bool SeachHelper(StringBuilder whereString, bool hasWhere)
        {
            if (!hasWhere)
                whereString.Append("where");
            else
                whereString.Append("and");
            return true;
        }

上面就是执行动态查询时的逐步优化,说道优化,其实是有一定的前提的,除了第一种情况最低能,其余的要根据实际的情况来进行确定。
如果查询条件非常少,甚至只有两种的情况的时候,则无所谓了,但是如果查询条件越多,那么后面的方法的效率越高。同时对于代码的可读

性越强,想一下,一个项目通常有多少人在写sql查询,如果没给人的风格不同,那么以后的维护人员就要遭罪了,通过使用通用的方法,那么

以后给代码的维护人员带来方便,同时拼接字符串的带来的额外开销也是不容忽视的,好的代码习惯很重要,一个系统从小的地方去注意,那

么最后一定是一个优秀的系统。

Sql动态查询拼接字符串的优化的更多相关文章

  1. (转)QueryBuilder : 打造优雅的Linq To SQL动态查询

    原文地址:http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html 首先我们来看看日常比较典型的一种查询Form 这个 ...

  2. sql 多条件查询 拼接字符串 改成 普通查询格式

    set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROC [dbo].[usp_SRV_CheckServiceDemandOrder] ) = ...

  3. MYSQL动态查询拼接的表名的SQL脚本实现(MYSQL动态执行SQL脚本)

    可以使用MYSQL的预处理逻辑:https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html   例如: pr ...

  4. SQL动态语句 拼接SQL 并输入输出值

    --动态语句语法 /****************************************************************************************** ...

  5. JPA的动态查询拼接

    在使用Spring JPA提供的方法只能进行简单的CRUD,如果遇到复杂的情况就需要我们动态来构建查询条件了.这里我们来看使用CriteriaBuilder如何来构造查询.核心代码: Criteria ...

  6. sql中用逗号拼接字符串

    MSSQL中可以用STUFF函数拼接成字符串. 如: SELECT FieldSomeElse, ( SELECT STUFF(( SELECT ',' + LinkField FROM Detail ...

  7. SQL STUFF函数 拼接字符串 多列 合并成一列 转

    关于和并列的 要这种效果. create table tb(idint, value varchar(10)) insert into tbvalues(1,'aa') insert into tbv ...

  8. SQL STUFF函数 拼接字符串

    今日看到一篇文章,是关于和并列的,也研究了下,还是不错的 要这种效果. create table tb(idint, value varchar(10)) insert into tbvalues(1 ...

  9. adoquery查询语句sql动态查询删除方法

    百度文库链接地址:http://wenku.baidu.com/link?url=uVzbjjaHIziYuproREP_hO7MTLMf2g998QTKN4oLMeko5D7k0vSlTMFaby2 ...

随机推荐

  1. Martin Fowler 分层测试概念博文分享

    在我们测试工作中,常常遇到这样的问题:开发与测试团队分属不同的不同(部门隔离.沟通不畅),质量职责划分不清(出现bug往往都是测试人员背锅),需求的不确定和易变性(需求不断变化导致代码不停更新.产品重 ...

  2. react项目开发中遇到的问题

    前言 作为一个前端爱好者来说,都想在react上一试生手,那么在搭建react项目开发时,肯定会有这样或者那样的问题,尤其是对初学者来说,下面就个人在开发过程中遇到的问题总结一下,好在有google帮 ...

  3. eclipse代码提示javadoc背景为黑色框的解决办法

    我的eclipse是近期下载的oxygen版本.不知道怎么出现了一个这个问题,鼠标悬停指向代码时应该出现的代码提示解释框,全为黑色,看不到文字.如下图 经过验证,最终解决方法为window->G ...

  4. ceph 源码安装 configure: error: "Can't find boost spirit headers"

    问题:configure: error: "Can't find boost spirit headers" 解决: 推荐:sudo apt-get install libboos ...

  5. 百度地图sdk---pc端

    <div class="map" style="width: 1196px;height: 500px;margin: 50px auto;"> & ...

  6. 读配置文件property文件

    import java.io.IOException;import java.util.Properties; import org.springframework.core.io.support.P ...

  7. linux apache+php+mysql安装及乱码解决办法

    1.乱码解决方法 首先确认mysql数据库字符集设置正确,php页面字符设置正确,之后修改apache配制文件http.conf 注释掉以下字符 AddDefaultCharset UTF-8 此为乱 ...

  8. java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)

    // java批量解压文件夹下的所有压缩文件(.rar..zip..gz..tar.gz) 新建工具类: package com.mobile.utils; import com.github.jun ...

  9. Ubuntu系统的安装(虚拟机) 并配置C/C++编译器

    一.系统的初始化配置 1.配置静态IP和DNS 配置静态IP 1.sudo vim /etc/network/interfaces,修改文件内容如下: auto eth0  #表示让网卡开机自动挂载e ...

  10. Unity学习系列一简介

    一.简介 Unity的目标是为了提升"依赖注入"的思想,去建立更加松耦合的系统.patterns & practices 小组在那个时候实现DI的方式和我们现在认为的DI有 ...