那这端代码怎么改写呢, <if test="gysbh == null and xmid != null"> FROM f_tj_yfzk_xm (#{startTime}, #{endTime}, #{username}, #{xmid}) AS a </if> FROM f_tj_yfzk (#{gysbh}, #{startTime}, #{endTime}, #{username}, #{xmid}, null) AS a
时间: 2023-11-01 12:16:51 浏览: 128
如果不允许使用otherwise元素,可以将该代码改写成以下形式:
```
<choose>
<when test="gysbh == null and xmid != null">
SELECT * FROM f_tj_yfzk_xm (#{startTime}, #{endTime}, #{username}, #{xmid}) AS a
</when>
<otherwise>
SELECT * FROM f_tj_yfzk (#{gysbh}, #{startTime}, #{endTime}, #{username}, #{xmid}, null) AS a
</otherwise>
</choose>
```
在上面的代码中,使用了choose和when元素来创建条件语句。如果第一个when元素的test条件成立,就执行第一个SQL语句。如果第一个when条件不成立,就执行otherwise元素中的SQL语句。
需要注意的是,choose元素中最多只能有一个otherwise元素,用于处理所有when都不成立的情况。此处的otherwise元素就是执行原来代码中的SQL语句。
相关问题
优化代码 String bmid = PubUtil.valueOf(listBXD.get("BXD_BMID")); String year = PubUtil.valueOf(listBXD.get("BXD_BXRQ")).substring(0, 4); String shsj = PubUtil.valueOf(listBXD.get("BXD_SHSJ")); String xmid = PubUtil.valueOf(listBXD.get("BXD_XMID")); String jhbh = PubUtil.valueOf(listBXD.get("BXD_XMJH_JHBH")); //部门年度发生额 String sql = "select ISNUll(sum(BXD_JE),0) as \"je\" from BXD where BXD_BMID = '"+bmid+"' " + "and BXD_SHBZ = 'Y' and DATEPART(YYYY,BXD_BXRQ) = '"+year+"'"; Double deptMoney = PubFunAction.queryForObj(sql, Double.class, 0.0); //更新部门年度发生额 sql = "update DBUDGET set DBUDGET_SJZC = '"+deptMoney+"' where DBUDGET_DEPTID = '"+bmid+"' and DBUDGET_YEAR = '"+year+"'"; PubFunAction.jt.update(sql); //项目年度发生额 sql = "select ISNULL(sum(BXD_JE),0) as \"je\" from BXD where BXD_XMID = '"+xmid+"' " + "and BXD_SHBZ = 'Y' and DATEPART(YYYY,BXD_BXRQ) = '"+year+"'"; Double projectMoney = PubFunAction.queryForObj(sql,Double.class,0.0); //更新项目年度发生额 sql = "update DBUDGETMX set DBUDGETMX_SJZC = '"+projectMoney+"' where DBUDGETMX_XMID = '"+xmid+"' and DBUDGETMX_YEAR = '"+year+"'"; PubFunAction.jt.update(sql); //经济分类年度发生额 for (Map<String, Object> bxdmx : listBXDMX) { String lbid = PubUtil.valueOf(bxdmx.get("BXDMX_BXLB_LBID")); sql = "select ISNULL(sum(BXDMX_BXJE),0) as \"je\" from BXD left join BXDMX on BXDMX_KEY=BXD_KEY " + "where BXDMX_BXLB_LBID = '"+lbid+"' and BXD_SHBZ = 'Y' and DATEPART(YYYY,BXD_BXRQ) = '"+year+"'"; Double economicClassificationMoney = PubFunAction.queryForObj(sql, Double.class, 0.0); } //更新合同计划完成标记 if (!"".equals(jhbh)){ sql = "update XMJH set XMJH_WCBZ = 'Y',XMJH_SJRQ_END = '"+shsj+"' where XMJH_JHBH = '"+jhbh+"'"; PubFunAction.jt.update(sql); }
可以优化的地方有:
1. 使用StringBuilder来拼接字符串,避免频繁地创建String对象。
2. 使用PreparedStatement来代替Statement,可以避免SQL注入攻击。
3. 将数据库连接池化,避免每次操作都创建和释放连接的开销。
4. 将查询结果缓存起来,避免重复查询。
5. 对于循环中的SQL语句,可以使用批量操作来提高效率。
6. 对于日期格式化操作,可以考虑使用SimpleDateFormat来优化。
7. 对于字符串转换成数字的操作,可以使用Double.parseDouble()方法来代替valueOf()方法。
8. 对于字符串的比较,可以使用equals()方法来代替"=="操作。
综合以上优化建议,可以对代码进行如下改进:
```
StringBuilder sqlBuilder = new StringBuilder();
String bmid = PubUtil.valueOf(listBXD.get("BXD_BMID"));
String year = PubUtil.valueOf(listBXD.get("BXD_BXRQ")).substring(0, 4);
String shsj = PubUtil.valueOf(listBXD.get("BXD_SHSJ"));
String xmid = PubUtil.valueOf(listBXD.get("BXD_XMID"));
String jhbh = PubUtil.valueOf(listBXD.get("BXD_XMJH_JHBH"));
//部门年度发生额
sqlBuilder.append("select ISNUll(sum(BXD_JE),0) as \"je\" from BXD where BXD_BMID = ? and BXD_SHBZ = 'Y' and DATEPART(YYYY,BXD_BXRQ) = ?");
Double deptMoney = PubFunAction.queryForObj(sqlBuilder.toString(), Double.class, 0.0, bmid, year);
//更新部门年度发生额
sqlBuilder.setLength(0);
sqlBuilder.append("update DBUDGET set DBUDGET_SJZC = ? where DBUDGET_DEPTID = ? and DBUDGET_YEAR = ?");
PubFunAction.jt.update(sqlBuilder.toString(), deptMoney, bmid, year);
//项目年度发生额
sqlBuilder.setLength(0);
sqlBuilder.append("select ISNULL(sum(BXD_JE),0) as \"je\" from BXD where BXD_XMID = ? and BXD_SHBZ = 'Y' and DATEPART(YYYY,BXD_BXRQ) = ?");
Double projectMoney = PubFunAction.queryForObj(sqlBuilder.toString(),Double.class,0.0, xmid, year);
//更新项目年度发生额
sqlBuilder.setLength(0);
sqlBuilder.append("update DBUDGETMX set DBUDGETMX_SJZC = ? where DBUDGETMX_XMID = ? and DBUDGETMX_YEAR = ?");
PubFunAction.jt.update(sqlBuilder.toString(), projectMoney, xmid, year);
//经济分类年度发生额
sqlBuilder.setLength(0);
sqlBuilder.append("select ISNULL(sum(BXDMX_BXJE),0) as \"je\" from BXD left join BXDMX on BXDMX_KEY=BXD_KEY where BXDMX_BXLB_LBID = ? and BXD_SHBZ = 'Y' and DATEPART(YYYY,BXD_BXRQ) = ?");
for (Map<String, Object> bxdmx : listBXDMX) {
String lbid = PubUtil.valueOf(bxdmx.get("BXDMX_BXLB_LBID"));
Double economicClassificationMoney = PubFunAction.queryForObj(sqlBuilder.toString(), Double.class, 0.0, lbid, year);
}
//更新合同计划完成标记
if (!"".equals(jhbh)){
sqlBuilder.setLength(0);
sqlBuilder.append("update XMJH set XMJH_WCBZ = 'Y',XMJH_SJRQ_END = ? where XMJH_JHBH = ?");
PubFunAction.jt.update(sqlBuilder.toString(), shsj, jhbh);
}
```
这个代码有什么问题CREATE FUNCTION [dbo].[XM_GetCJL_QTDWMX] ( @XMID int ) RETURNS varchar(2000) AS BEGIN declare @res varchar(Max) select top 1 @res= case when ISNULL(a.QTDWFGLD,'')!='' or isnull(a.QTDWFGLDSJ,'')!='' then '联系领导(副处级以上):'+isnull(a.QTDWFGLD,'')+' '+isnull(a.QTDWFGLDSJ,'') +CHAR(10) else '' end + case when ISNULL(a.QTDWLXR,'')!='' or isnull(a.QTDWLXRSJ,'')!='' then '服务专员:'+isnull(a.QTDWLXR,'')+' '+isnull(a.QTDWLXRSJ,'') else '' end gnqyj from TZ_XMXX_CJL_QTDW a where XMID=1 return @res END
这段代码有几个问题:
1. 函数声明中的返回类型应为 `NVARCHAR(2000)`,而不是 `VARCHAR(2000)`。因为函数返回的字符串可能包含非 ASCII 字符,如中文字符,所以应该使用 Unicode 编码。
2. 函数声明中的 `@res` 变量没有指定长度,应该将其声明为 `NVARCHAR(MAX)`,以便能够容纳较长的字符串。
3. 在查询语句中,将 `from TZ_XMXX_CJL_QTDW a where XMID=1` 改为 `from TZ_XMXX_CJL_QTDW a where XMID=@XMID`,以便根据传入的参数 `@XMID` 进行查询。
修复后的代码如下所示:
```sql
CREATE FUNCTION [dbo].[XM_GetCJL_QTDWMX] (@XMID INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @res NVARCHAR(MAX)
SELECT TOP 1 @res =
CASE
WHEN ISNULL(a.QTDWFGLD, '') != '' OR ISNULL(a.QTDWFGLDSJ, '') != '' THEN '联系领导(副处级以上):' + ISNULL(a.QTDWFGLD, '') + ' ' + ISNULL(a.QTDWFGLDSJ, '') + CHAR(10)
ELSE ''
END +
CASE
WHEN ISNULL(a.QTDWLXR, '') != '' OR ISNULL(a.QTDWLXRSJ, '') != '' THEN '服务专员:' + ISNULL(a.QTDWLXR, '') + ' ' + ISNULL(a.QTDWLXRSJ, '')
ELSE ''
END
FROM TZ_XMXX_CJL_QTDW a
WHERE XMID = @XMID
RETURN @res
END
```
请注意,我假设你想根据传入的 `@XMID` 参数进行查询,所以将原始代码中的 `XMID=1` 改为 `XMID=@XMID`。如果你的意图是固定查询 `XMID` 为 1,那么可以忽略这个修改。
阅读全文