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 ...
随机推荐
- python使用httplib2访问REST服务的例子
首先你需要安装httplib2,这个可以在github上找到: 然后你需要获得一个http连接的对象: con = httplib2.Http() 然后你需要发起连接: (6)resp, (5)c ...
- hadoop 的HDFS 的 standby namenode无法启动事故处理
standby namenode无法启动 现象:线上使用的2.5.0-cdh5.3.2版本Hadoop,开启了了NameNode HA,HA采用QJM方式.hadoop的集群的namenode的sta ...
- css中“~”和“>”是什么意思
p~ul选择器 p之后出现的所有ul. 两种元素必须拥有相同的父元素,但是 ul不必直接紧随 p. css中“>”是: css3特有的选择器,A>B 表示选择A元素的所有子B元素. 与A ...
- IE6下javascript:void(0)不可用的解决
<a href="javascript:void(0)" class="inp_sear_a" onclick="doSubmit();&quo ...
- Vue过渡动画—Vue学习笔记
要求:要通过Vue使用过渡动画我们要把需要过度的元素放在<transition name='变量名'></transition>中. 原理:通过在特定的时刻增加/移除样式实现. ...
- vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件
vue教程3-03 vue组件,定义全局.局部组件,配合模板,动态组件 一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3&g ...
- MySQL笔记(3)---文件
1.前言 第二章简单记录了一下InnoDB存储引擎的一个基本内容,介绍了保证高效插入的Insert Buffer,change Buffer和确保数据安全的write ahead log以及doubl ...
- ICANN认证注册商小全 英、德、法
转载 在ICANN认证注册商小全(一)和ICANN认证注册商小全(二)中,QQPCC介绍了美洲的各ICANN认证注册商.今天我们移师欧洲,介绍欧洲的ICANN认证注册商,欧洲的注册商也很多,不可能在一 ...
- PLSQL Developer是什么?
不多说,直接上干货! PLSQL Developer是一款可以帮助用户管理Oracle数据库开发存储程序单元的集成开发环境IDE,通过该软件,用户可以编辑.编译.纠正.测试.调试.优化.查询您的数据信 ...
- 【转】linux sar命令详解
原文地址:http://lovesoo.org/linux-sar-command-detailed.html sar(System Activity Reporter系统活动情况报告)是目前 Lin ...