输入参数个数不确定时如何写SQL语句
2022/6/15 6:20:14
本文主要是介绍输入参数个数不确定时如何写SQL语句,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
以查询货币汇率的应用为例,用户在前端页面选择查询参数后,传到后端的参数有起始日期、结束日期和若干币种(以数组形式),币种的数量是不确定的,要求查询在起始日期和结束日期之间,用户所选币种的汇率信息。
在数据库里,有两张表,一张表是汇率表(表名称bgt_rate),字段有id、date、currency、rate四个字段分别表示编号、日期、币种代号、汇率,另一张表是币种信息表(表名称bgt_currency),有currency、name两个字段,分别表示币种代号、币种的中文名称。
后端的Controller接收前端发来的参数:
@RequestMapping(value = {"rate/searchCurrency"}, method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public JSONArray searchCurrency(@RequestBody Map<String,Object> data, HttpServletRequest request, HttpServletResponse response) throws Exception { ArrayList<String> currency = (ArrayList<String>) data.get("listOfCurrency"); //币种数组 String startDate=(String)data.get("startDate"); //起始日期 String endDate=(String)data.get("endDate"); //结束日期 List<com.entity.Rate> rates=rateInterface.getRates(startDate,endDate,currency); //通过自定义接口函数查询 JSONArray array= JSONArray.parseArray(JSON.toJSONString(rates)); return array; }
查询的自定义接口函数:
public List<Rate> getRates(String startDate,String endDate,@Param("currency") ArrayList<String> currency);
Mapper文件中的SQL语句如下,主要是通过foreach来获得币种数组中的每个币种,并用concat函数拼接成最终的SQL语句。
<select id="getRates" resultType="com.entity.Rate"> select r.*, c.name as name from bgt_rate r left join bgt_currency c on r.`currency`=c.`currency` where (r.`date` between #{startDate} and #{endDate}) and (<foreach collection="currency" item="item" index="index" separator="OR">c.`name` like CONCAT('%',#{item},'%') </foreach>) </select>
上面的SQL语句在正常情况下运行没有问题,但是当用户没有选择任何币种时,currency数组为空,这时候会发生错误,为避免出错,需要修改一下SQL语句,变成下面的样子。增加了<choose>标签,1=1表示当currency为空或长度为0时,保证SQL语句里的and后面仍有语句,不致于报错。这里的currency是ArrayList类型,所以判断语句里是用currency.size() !=0,如果currency是数组类型,则应改成currency.length !=0。
<select id="getRates" resultType="com.entity.Rate"> select r.*, c.name as name from bgt_rate r left join bgt_currency c on r.`currency`=c.`currency` where (r.`date` between #{startDate} and #{endDate}) and ( <choose> <when test="currency != null and currency.size() !=0"> <foreach collection="currency" item="item" index="index" separator="OR">c.`name` like CONCAT('%',#{item},'%') </foreach> </when> <otherwise> 1 = 1 </otherwise> </choose> ) </select>
这篇关于输入参数个数不确定时如何写SQL语句的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南