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. Maven的阿里云镜像

    打开“Maven安装目录/conf/settings.xml”文件,找到<mirrors>节点,添加: <mirror> <id>nexus-aliyun</ ...

  2. 基于Redis的CAS集群

    单点登录(SSO)是复杂应用系统的基本需求,Yale CAS是目前常用的开源解决方案.CAS认证中心,基于其特殊作用,自然会成为整个应用系统的核心,所有应用系统的认证工作,都将请求到CAS来完成.因此 ...

  3. Linux下替代grep高效文本搜索工具

    1.ack yum install ack 2.ag git clone https://github.com/ggreer/the_silver_searcher.git yum install a ...

  4. 利用GDI+处理图像的色彩

    首先先介绍一下ColorMatrix结构体:表示颜色的变换关系,定义如下: typedef struct { REAL m[][]; } ColorMatrix; ColorMatrix结构体一般和I ...

  5. 在ASP.NET MVC应用中开发插件框架(中英对照)

    [原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I’v ...

  6. [BeiJing wc2012]连连看(建模,最小费用最大流)

    前言 突然发现自己在图论①被dalao吊着打... Solution 看到数据范围1000,感觉可以直接枚举连边,然后新建两个点就好了. 注意要拆点,不然可能会死循环(过来人) 代码实现 #inclu ...

  7. 前端基础-html 介绍和head标签 ( 1 )

    主要内容 web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 HTML规范 HTML结构详解 写在前面: 前端               后端 C(client)        S ...

  8. SpringCloud之Eureka集群

    前面我们介绍了SpringCloud注册中心Eureka,但是存在一个单点故障的问题,一个注册中心远远不能满足实际的生产环境,现在我们介绍一下如何搭建一个Eureka集群. 一:集群环境搭建 我们先建 ...

  9. CSS3盒子模型(上)

    CSS的盒子模型分为三个大模块: 盒子模型 . 浮动 . 定位,其余的都是细节.要求这三部分,只要是学前端的无论如何也要学的非常精通. 所谓盒子模型就是把HTML页面中的元素看作是一个矩形的盒子,也就 ...

  10. CentOS的ssh sftp配置及权限设置[转载-验证可用]

    从技术角度来分析,几个要求:1.从安全方面看,sftp会更安全一点2.线上服务器提供在线服务,对用户需要控制,只能让用户在自己的home目录下活动3.用户只能使用sftp,不能ssh到机器进行操作 提 ...