报表众多的系统,不仅仅是where子句存在拼接,join子句也可能需要拼接。还是看代码:
String sql=" select * from bill ";
if (queryParams.pTypeId != null)
{
dbHelper.AddParameter("@ptypeid", ptypeid);
sqlWhere += " and p.typeid like @ptypeid ";
sqlJoin += " inner join ptype p on a.ptypeid = p.id ";
}
if (queryParams.eTypeId != null)
{
dbHelper.AddParameter("@etypeid", etypeid);
sqlWhere += " and e.typeid like @etypeid ";
sqlJoin += " inner join employee e on a.etypeid = e.id";
}
if (queryParams.kTypeId != null)
{
dbHelper.AddParameter("@ktypeid", ktypeid);
sqlWhere += " and k.typeid like @ktypeid ";
sqlJoin += " left join stock k on a.ktypeid = k.id ";
}
新代码:
String sql=@"
select * from bill
inner join ptype p on @enablePtypeJoin and a.ptypeid = p.id and a.profileid = p.profileid
inner join employee e on @enableEtypeJoin and a.etypeid = e.id and a.profileid = e.profileid
left join stock k on @enableKtypeJoin and a.ktypeid = k.id
where
and (@enablePtypeJoin and p.typeid like @ptypeid )
and (@enableEtypeJoin and e.typeid like @etypeid )
and (@enableKtypeJoin and p.typeid like @ktypeid )
";
dbHelper.AddParameter("@ptypeid", ptypeid );
dbHelper.AddParameter("@etypeid", etypeid);
dbHelper.AddParameter("@ktypeid", ktypeid);
dbHelper.AddParameter("@enablePtypeJoin",ptypeid != null);
dbHelper.AddParameter("@enableKtypeJoin",ktypeid != null);
dbHelper.AddParameter("@enableEtypeJoin",etypeid != null);
新代码的特点是采用了@EnableXXX型的bool值插入了join子句和Where子句内。
比如 (@enablePtypeJoin and p.typeid like @ptypeid ),当enablePtypeJoin 为false 的时候,p.typeid like @ptypeid就等于没有拼接进来一样,当enablePtypeJoin 为 true 的时候,@enablePtypeJoin=true也是没用的。从而通过这个@EnableXXX达到和拼接一样的效果。
通过 mysql 的explain可以看到:采用@enableXXX的方法可能会降低效能。不过需要实际测试才知道。因为,即使 @enablePtypeJoin=false,连接也还是发生了。同样的语句,在在sqlserver中,从执行计划上可以看出, @enablePtypeJoin=false的时候,join不会发生,故而不会降低效能。
新代码其实是伪代码,因为在sqlserver内,并没有bool类型。通常会用1=1 和1=0表达true/false,因此,
dbHelper.AddParameter("@enablePtypeJoin",ptypeid != null);
必须做出修改,适应这个情况:
dbHelper.AddParameter("@enablePtypeJoin",ptypeid != null?1:0);
对应的:
and (@enablePtypeJoin and p.typeid like @ptypeid )
需要改成:
and (1=@enablePtypeJoin and p.typeid like @ptypeid )
阅读效果稍微差了一点,带上比起原来的代码好要的多了。
相关推荐
sql server拼接字符串查询语句。 普通拼接字符串和拼接某一列的所有值。
SQL字符串函数大全 1、SQL 字符串函数大全-去空格函数 ...3、SQL 字符串处理函数大全 一、字符转换函数 二、去空格函数 三、取子串函数 四、字符串比较函数 五、字符串操作函数 六、数据类型转换函数 七、日期函数
SqlServer2000,用语数据库字符串相加的一个函数 用于字符串相加,字符串拼接
SQL 字符串处理函数 获取指定的字符
Qt 格式化字符串 - Avatarx - 博客园博客园首页新随笔联系管理订阅随笔- 1695 文章- 0 评论- 3Qt 格式化字符串Qt字符串格式化性能比较
一个sql的多字符的检索源码非常有帮助的实例,初学者值得拥有
sql 多行合并某一列字符串拼接的示例语句
SQL字符串函数SQL字符串函数SQL字符串函数SQL字符串函数SQL字符串函数SQL字符串函数SQL字符串函数SQL字符串函数
SQL Server 将某一列的值拼接成字符串示例
ms sql server 字符合计,类似sum函数的功能,不过是针对字符型!
SQL截取以逗号分隔的字符串SQL截取以逗号分隔的字符串SQL截取以逗号分隔的字符串SQL截取以逗号分隔的字符串
SQL Server字符串处理函数大全 sql server是一个数据库,文档介绍了这个数据库的字符串操作函数
SQL截取字符串函数(1、截取从字符串左边开始N个字符 2、截取从字符串右边开始N个字符(例如取字符www.163.com) 3、截取字符串中任意位置及长度 等等)
用SQL语句截取字符串, string substr ( string string, int start [, int length]) 参数1:处理字符串 参数2:截取的起始位置(第一个字符是从0开始) 参数3:截取的字符数量
一款方便将java与sql语句互相转换的小工具,在日常工作开发中,非常实用,f方便写字符串拼接的语句,常用选项是String和StringBuffer
讲解了ABAP SQL Functions for Strings的使用
MyBatis的动态SQL,解决了SQL字符串拼接的痛苦。下文分步骤给大家详细介绍了MyBatis 动态拼接Sql字符串的问题,非常不错,感兴趣的朋友一起看下吧
SQL字符串处理函数大全
sqlserver中根据某个字符切割字符串函数,比如根据逗号切割字符串,结果返回的是一个表值函数,这个函数返回结果字段包含Id和Value,Id为序号,Value为切割后的值
MyBatis动态拼接SQL