Sql动态查询拼接字符串的优化
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动态查询拼接字符串的优化的更多相关文章
- (转)QueryBuilder : 打造优雅的Linq To SQL动态查询
原文地址:http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html 首先我们来看看日常比较典型的一种查询Form 这个 ...
- sql 多条件查询 拼接字符串 改成 普通查询格式
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROC [dbo].[usp_SRV_CheckServiceDemandOrder] ) = ...
- MYSQL动态查询拼接的表名的SQL脚本实现(MYSQL动态执行SQL脚本)
可以使用MYSQL的预处理逻辑:https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html 例如: pr ...
- SQL动态语句 拼接SQL 并输入输出值
--动态语句语法 /****************************************************************************************** ...
- JPA的动态查询拼接
在使用Spring JPA提供的方法只能进行简单的CRUD,如果遇到复杂的情况就需要我们动态来构建查询条件了.这里我们来看使用CriteriaBuilder如何来构造查询.核心代码: Criteria ...
- sql中用逗号拼接字符串
MSSQL中可以用STUFF函数拼接成字符串. 如: SELECT FieldSomeElse, ( SELECT STUFF(( SELECT ',' + LinkField FROM Detail ...
- SQL STUFF函数 拼接字符串 多列 合并成一列 转
关于和并列的 要这种效果. create table tb(idint, value varchar(10)) insert into tbvalues(1,'aa') insert into tbv ...
- SQL STUFF函数 拼接字符串
今日看到一篇文章,是关于和并列的,也研究了下,还是不错的 要这种效果. create table tb(idint, value varchar(10)) insert into tbvalues(1 ...
- adoquery查询语句sql动态查询删除方法
百度文库链接地址:http://wenku.baidu.com/link?url=uVzbjjaHIziYuproREP_hO7MTLMf2g998QTKN4oLMeko5D7k0vSlTMFaby2 ...
随机推荐
- Maven的阿里云镜像
打开“Maven安装目录/conf/settings.xml”文件,找到<mirrors>节点,添加: <mirror> <id>nexus-aliyun</ ...
- 基于Redis的CAS集群
单点登录(SSO)是复杂应用系统的基本需求,Yale CAS是目前常用的开源解决方案.CAS认证中心,基于其特殊作用,自然会成为整个应用系统的核心,所有应用系统的认证工作,都将请求到CAS来完成.因此 ...
- Linux下替代grep高效文本搜索工具
1.ack yum install ack 2.ag git clone https://github.com/ggreer/the_silver_searcher.git yum install a ...
- 利用GDI+处理图像的色彩
首先先介绍一下ColorMatrix结构体:表示颜色的变换关系,定义如下: typedef struct { REAL m[][]; } ColorMatrix; ColorMatrix结构体一般和I ...
- 在ASP.NET MVC应用中开发插件框架(中英对照)
[原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I’v ...
- [BeiJing wc2012]连连看(建模,最小费用最大流)
前言 突然发现自己在图论①被dalao吊着打... Solution 看到数据范围1000,感觉可以直接枚举连边,然后新建两个点就好了. 注意要拆点,不然可能会死循环(过来人) 代码实现 #inclu ...
- 前端基础-html 介绍和head标签 ( 1 )
主要内容 web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 HTML规范 HTML结构详解 写在前面: 前端 后端 C(client) S ...
- SpringCloud之Eureka集群
前面我们介绍了SpringCloud注册中心Eureka,但是存在一个单点故障的问题,一个注册中心远远不能满足实际的生产环境,现在我们介绍一下如何搭建一个Eureka集群. 一:集群环境搭建 我们先建 ...
- CSS3盒子模型(上)
CSS的盒子模型分为三个大模块: 盒子模型 . 浮动 . 定位,其余的都是细节.要求这三部分,只要是学前端的无论如何也要学的非常精通. 所谓盒子模型就是把HTML页面中的元素看作是一个矩形的盒子,也就 ...
- CentOS的ssh sftp配置及权限设置[转载-验证可用]
从技术角度来分析,几个要求:1.从安全方面看,sftp会更安全一点2.线上服务器提供在线服务,对用户需要控制,只能让用户在自己的home目录下活动3.用户只能使用sftp,不能ssh到机器进行操作 提 ...