报表众多的系统,不仅仅是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字符串的格式化不仅关乎美观,更是直接影响到代码的可读性和维护性。尤其是在大型项目中,一致的代码风格对于团队协作至关重要。因此,理解并掌握如何使用这样的工具,是每个IT专业人员提升专业...
- 使用参数化SQL查询,避免字符串拼接,减少SQL注入风险。 - 避免使用中文拼音与英文混合命名SQL对象或变量,提高代码一致性。 - 引入存储过程,将复杂逻辑封装,提高代码复用。 1. 命名规范 - 推荐使用Pascal...
Go-SQLBuilder解决了这个问题,它允许开发者使用结构化的方式构建SQL,避免了字符串拼接带来的问题,降低了SQL注入的风险。 Go-SQLBuilder的核心功能包括: 1. **链式操作**:通过一系列的链式调用,如`Select()`,...
10. **测试与调试**:由于Go-sqrl的SQL语句是通过代码构建的,因此在测试和调试时,可以很容易地查看生成的SQL字符串,确保其符合预期。 掌握Go-sqrl不仅可以提升Go语言数据库应用的开发效率,还能确保代码的安全性...
这种方法简单直观,但当需要拼接的字符串很多时,代码会变得很长且难以阅读。 另一种方法是利用模板字符串(Template literals),也称为模板字面量,它允许我们在字符串中直接插入变量并支持多行。模板字符串用反...
- **动态SQL构造**:通过字符串拼接的方式构建SQL语句,这种方式在处理动态生成SQL时非常有用,但需要注意避免SQL注入问题。 - **使用游标进行数据处理**:`OPEN cur FOR v_sql;`打开一个游标,使用`FETCH cur BULK ...
它提供了构建WHERE子句、ORDER BY子句、JOIN子句等的API,可以根据条件动态添加或修改SQL片段,避免了硬编码SQL字符串的问题。 SqlBuilder的核心功能包括: 1. **条件构造**:通过条件对象或者表达式来构造WHERE...
若有多个列,每个列名独立一行,并相对于`SELECT`向右缩进8个空格(C#中的SQL字符串无需缩进)。 - `FROM`子句中的表名或联接条件也应独立一行。 - 使用`WHERE`子句时,条件应逐一列出,每个条件占一行,复杂的...
- **字符串连接**:最基础的方法是通过字符串连接函数,如Python中的`join()`或Java中的`StringBuilder`,逐个添加元素到SQL语句中。 - **模板引擎**:使用如Jinja2(Python)或FreeMarker(Java)等模板引擎,...
在传统的Java编程中,我们通常需要手动拼接SQL字符串,这容易导致SQL注入问题,并且难以维护。MyBatis通过标签和表达式来实现动态SQL,使得SQL的编写更加简洁、安全。 二、动态SQL的常用标签 1. `<if>`:用于条件...
- 避免不必要的字符串拼接或类型转换,如直接使用数值比较而非字符串比较。 - 在比较日期时,直接使用日期函数而非字符串函数可以提高效率。 ### 10. GROUP BY 和 HAVING 子句的使用 - **GROUP BY**:用于将数据...
参数化查询能够帮助防御SQL注入攻击,并且在大多数情况下性能优于字符串拼接。 - 适当地使用预编译SQL语句提高执行效率。预编译可以减少编译和解析的时间,对于经常执行的SQL语句来说尤为重要。 - **存储过程与...
通过使用sqlm,开发者可以避免直接拼接字符串来构建SQL,从而减少SQL注入的风险。 在使用sqlm时,你需要先安装这个库,这可以通过Golang的包管理工具`go get`来完成: ```bash go get github....
这样可以避免在多个条件拼接时产生不必要的AND或OR,提高SQL的可读性: ```xml SELECT * FROM user != null">name = #{name} != null">AND age = #{age} ``` 5. **Trim标签**: `<trim>`标签与`...
在易语言中,你可以创建SQL命令模板,并将变量作为参数传递,这样可以避免直接拼接字符串导致的安全问题。 4. **事务处理**:在进行多个SQL语句切换时,事务处理是非常重要的。事务确保一系列操作要么全部成功,...
- **动态SQL**:使用变量和字符串拼接来构建动态的SQL语句,适用于需要运行复杂查询的场景。 - **应用示例**: - 在实际开发中,可以根据业务需求灵活运用上述技巧来编写高效的SQL脚本。 - 比如,当需要对大量...
- 连字运算符`||`用于将两个字符串拼接起来,例如`SELECT 列名1 || ' ' || 列名2 FROM 表名;`。 - **1.4.9 文字字符串** - 在SQL中,字符串常量使用单引号括起来,例如`'Hello World'`。 - **1.4.10 相同的行** -...
`Loukoum`并不直接与数据库交互,而是返回SQL字符串和绑定的参数,你需要使用Go的`database/sql`包或其他ORM库(如Gorm)来执行这些查询。例如: ```go db, err := sql.Open("postgres", "your-database-connection...
在实际应用中,字符串拼接是一个非常常见的需求。除了使用逗号`,`外,还可以考虑使用其他分隔符,例如竖线`|`或者管道符号`|`等。此外,还需要注意当拼接的字段包含特殊字符时,可能需要进行转义处理。 #### 其他 ...
- **1.5.2 字符串表达式**: 支持字符串连接、拼接等操作。 - **1.5.3 时间值表达式**: 支持日期和时间的计算。 - **1.5.4 时间间隔值表达式**: 支持时间间隔的运算。 - **1.5.5 运算符的优先级**: DM_SQL定义了...