`
1000copy
  • 浏览: 74373 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

改善sql字符串的可读性(3) - 多个可选Join 拼接优化

阅读更多

 

报表众多的系统,不仅仅是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 )

阅读效果稍微差了一点,带上比起原来的代码好要的多了。


0
1
分享到:
评论

相关推荐

    将SQL字符串按不同开发语言格式化

    在实际应用中,SQL字符串的格式化不仅关乎美观,更是直接影响到代码的可读性和维护性。尤其是在大型项目中,一致的代码风格对于团队协作至关重要。因此,理解并掌握如何使用这样的工具,是每个IT专业人员提升专业...

    Transact-SQL编程规范

    - 使用参数化SQL查询,避免字符串拼接,减少SQL注入风险。 - 避免使用中文拼音与英文混合命名SQL对象或变量,提高代码一致性。 - 引入存储过程,将复杂逻辑封装,提高代码复用。 1. 命名规范 - 推荐使用Pascal...

    Go-Go-SQLBuilder是一个用于创建SQL语句的工具函数库

    Go-SQLBuilder解决了这个问题,它允许开发者使用结构化的方式构建SQL,避免了字符串拼接带来的问题,降低了SQL注入的风险。 Go-SQLBuilder的核心功能包括: 1. **链式操作**:通过一系列的链式调用,如`Select()`,...

    Go-sqrl-SQL查询构建器Squirrel的分支并改进了性能

    10. **测试与调试**:由于Go-sqrl的SQL语句是通过代码构建的,因此在测试和调试时,可以很容易地查看生成的SQL字符串,确保其符合预期。 掌握Go-sqrl不仅可以提升Go语言数据库应用的开发效率,还能确保代码的安全性...

    Javascript中拼接大量字符串的方法

    这种方法简单直观,但当需要拼接的字符串很多时,代码会变得很长且难以阅读。 另一种方法是利用模板字符串(Template literals),也称为模板字面量,它允许我们在字符串中直接插入变量并支持多行。模板字符串用反...

    sql优化带代码

    - **动态SQL构造**:通过字符串拼接的方式构建SQL语句,这种方式在处理动态生成SQL时非常有用,但需要注意避免SQL注入问题。 - **使用游标进行数据处理**:`OPEN cur FOR v_sql;`打开一个游标,使用`FETCH cur BULK ...

    SqlBuilder

    它提供了构建WHERE子句、ORDER BY子句、JOIN子句等的API,可以根据条件动态添加或修改SQL片段,避免了硬编码SQL字符串的问题。 SqlBuilder的核心功能包括: 1. **条件构造**:通过条件对象或者表达式来构造WHERE...

    SQL编码规范.doc

    若有多个列,每个列名独立一行,并相对于`SELECT`向右缩进8个空格(C#中的SQL字符串无需缩进)。 - `FROM`子句中的表名或联接条件也应独立一行。 - 使用`WHERE`子句时,条件应逐一列出,每个条件占一行,复杂的...

    分离valuelist的sql拼装

    - **字符串连接**:最基础的方法是通过字符串连接函数,如Python中的`join()`或Java中的`StringBuilder`,逐个添加元素到SQL语句中。 - **模板引擎**:使用如Jinja2(Python)或FreeMarker(Java)等模板引擎,...

    MyBatis之动态SQL-资料

    在传统的Java编程中,我们通常需要手动拼接SQL字符串,这容易导致SQL注入问题,并且难以维护。MyBatis通过标签和表达式来实现动态SQL,使得SQL的编写更加简洁、安全。 二、动态SQL的常用标签 1. `<if>`:用于条件...

    本人提供SQL语句大全(转载) 12009年04月28日 星期二 19:35SQL语句大全(转载)

    - 避免不必要的字符串拼接或类型转换,如直接使用数值比较而非字符串比较。 - 在比较日期时,直接使用日期函数而非字符串函数可以提高效率。 ### 10. GROUP BY 和 HAVING 子句的使用 - **GROUP BY**:用于将数据...

    SQL入门常见问题总结与实用技巧介绍.docx

    参数化查询能够帮助防御SQL注入攻击,并且在大多数情况下性能优于字符串拼接。 - 适当地使用预编译SQL语句提高执行效率。预编译可以减少编译和解析的时间,对于经常执行的SQL语句来说尤为重要。 - **存储过程与...

    Go-sqlmGolang语言的一个简洁SQL查询构建器

    通过使用sqlm,开发者可以避免直接拼接字符串来构建SQL,从而减少SQL注入的风险。 在使用sqlm时,你需要先安装这个库,这可以通过Golang的包管理工具`go get`来完成: ```bash go get github....

    mybatis-demo11-动态SQL语句.zip

    这样可以避免在多个条件拼接时产生不必要的AND或OR,提高SQL的可读性: ```xml SELECT * FROM user != null">name = #{name} != null">AND age = #{age} ``` 5. **Trim标签**: `<trim>`标签与`...

    SQL语句切换.rar

    在易语言中,你可以创建SQL命令模板,并将变量作为参数传递,这样可以避免直接拼接字符串导致的安全问题。 4. **事务处理**:在进行多个SQL语句切换时,事务处理是非常重要的。事务确保一系列操作要么全部成功,...

    sql脚本 实用

    - **动态SQL**:使用变量和字符串拼接来构建动态的SQL语句,适用于需要运行复杂查询的场景。 - **应用示例**: - 在实际开发中,可以根据业务需求灵活运用上述技巧来编写高效的SQL脚本。 - 比如,当需要对大量...

    oracle数据库

    - 连字运算符`||`用于将两个字符串拼接起来,例如`SELECT 列名1 || ' ' || 列名2 FROM 表名;`。 - **1.4.9 文字字符串** - 在SQL中,字符串常量使用单引号括起来,例如`'Hello World'`。 - **1.4.10 相同的行** -...

    Go-Loukoum一个简单的SQL查询生成器

    `Loukoum`并不直接与数据库交互,而是返回SQL字符串和绑定的参数,你需要使用Go的`database/sql`包或其他ORM库(如Gorm)来执行这些查询。例如: ```go db, err := sql.Open("postgres", "your-database-connection...

    数据库函数

    在实际应用中,字符串拼接是一个非常常见的需求。除了使用逗号`,`外,还可以考虑使用其他分隔符,例如竖线`|`或者管道符号`|`等。此外,还需要注意当拼接的字段包含特殊字符时,可能需要进行转义处理。 #### 其他 ...

    达梦数据库_SQL语言手册

    - **1.5.2 字符串表达式**: 支持字符串连接、拼接等操作。 - **1.5.3 时间值表达式**: 支持日期和时间的计算。 - **1.5.4 时间间隔值表达式**: 支持时间间隔的运算。 - **1.5.5 运算符的优先级**: DM_SQL定义了...

Global site tag (gtag.js) - Google Analytics