当前位置:网站首页>mysql学习笔记——利用动态SQL和Session变量实现一个公式或者计算器
mysql学习笔记——利用动态SQL和Session变量实现一个公式或者计算器
2022-08-04 16:52:00 【MaraSun】
最近做的一个项目,用户要求在用户提示端,要显示用户关心的数值,而不是原始数值。并且这个数值在每个设备上是不同的,或者说这个数值是测量值的一个函数。 那么我首先想到的是,要做一个计算器之类的东西,然后里面要有变量,换言之我要做一个公式计算器。好像越想越复杂,我大约还要做一个简单的编译器吗?这个也有点儿过了吧?
前端输入我用的是C#,C#里面有个东西加datatable ,这个东西有个方法是Compute,它可以完成计算器的任务。那么好了,我可以输入一个公式,然后用具体的值将其中的变量替换掉,再引用这个方法就可以了。现在的问题来到服务端了。服务端是mysql,这个家伙好像没有这个函数。网搜了一下,有大侠用AST 实现了计算器,不过感觉还是有点儿小题大做啊。想到l了动态SQL,既然MySQL支持动态SQL,那么就可以支持计算器功能啊。这个很简单。例如
set @formula = "select 1+2";
PREPARE stmt FROM @formula ;
EXECUTE stmt ;
deallocate prepare stmttmt;
运行结果如下
现在的问题是怎么在代码中获得这个结果?我本能的想到了,@ 类型的变量是个神奇的东西,那么它是否也被动态的mysql支持呢?
于是我写出了下面的测试语句
set @formula = "select 1+2 into @result";
PREPARE stmt FROM @formula ;
EXECUTE stmt ;
deallocate prepare stmt;
select @result;
运行一下
Done!
OK,这样解决了这个貌似比较难的题目。
一个公式的比较完整的代码如下
-- store the formula in a json variable
set @formulaStr='[{"Name": "用户值","Formula": "[email protected]", "FormulaVarArr": [{"Var": "H1", "Brief": "", "Value": 0.0}, {"Var": "h2", "Brief": "", "Value": 0.0}, {"Var": "@DevValue", "Brief": "", "Value": 0.0}]}, null]';
-- get the formula
set @i =0;
set @jsIndex = concat("$[",@i,"].Formula");
set @formula = json_unquote(json_extract(@formulaStr,@jsIndex));
set @jsIndex = concat("$[",@i,"].FormulaVarArr");
set @FormulaVarArr = json_unquote(json_extract(@formulaStr,@jsIndex));
set @fmlArrLen = JSON_LENGTH(@FormulaVarArr);
set @j=0;
-- get the variable of the formula ,
set @jsIndex = concat("$[",@j,"].Var");
set @var = json_unquote(json_extract(@FormulaVarArr,@jsIndex));
set @jsIndex = concat("$[",@j,"].Value");
set @Val = json_extract(@FormulaVarArr,@jsIndex);
-- replace the variable with the actual value
set @formula =REPLACE(@formula,@var,@Val);
select @formula,@var,@val;
set @j=@j+1;
set @jsIndex = concat("$[",@j,"].Var");
set @var = json_unquote(json_extract(@FormulaVarArr,@jsIndex));
set @jsIndex = concat("$[",@j,"].Value");
set @Val = json_extract(@FormulaVarArr,@jsIndex);
set @formula =REPLACE(@formula,@var,@Val);
set @formula =REPLACE(@formula,"@DevValue","10");
set @j=@j+1;
-- form the dynamic stl string
set @sql = concat("select ",@formula, " into @dspValue");
select @sql;
PREPARE stmt FROM @sql ;
EXECUTE stmt ;
deallocate prepare stmt;
-- get the calculation
select @dspValue;
说明:上面代码可以直接运行测试,由于公式不止一个,因此运用了JSON数组,不过上面只取了第一个,没有使用循环语句。
是记
maraSun BJFWDQ
洛佩希窜访台湾,大国不堪围岛军演。关键词,拭目以待。
边栏推荐
- ES中同时使用should和must导致只有must生效解决方案
- 移动百事通BesTV_R3300-L_S905L_8189_线刷固件包
- 咪咕MGV2000KL南传_S905L3B_MT7668线刷固件包
- 电气成套设备行业如何借助ERP系统,解决企业管理难题?
- 15 days to upgrade to fight monsters and become a virtual fashion creator
- “敏捷欺骗了开发人员”
- Minecraft 服务器安装Forge 并添加Mod
- 工龄10年的测试员从大厂“裸辞”后...
- 太一集团宣布全资收购火币旗下社交产品火信
- 麒麟信安石勇博士荣获openEuler社区年度开源贡献之星
猜你喜欢
工龄10年的测试员从大厂“裸辞”后...
从正负样本解耦看对比学习为何需要large batch size训练Ddcoupled Contrastive learning (DCT)
18 Data Collection Analysis
奖金池高达 20 万,RTE 2022 创新编程挑战赛正式开启
移动海信IP102H_905L3-B_线刷固件包
历史上的今天:微软研究院的创始人诞生;陌陌正式上线;苹果发布 Newton OS
移动中兴ZXV10 B860AV2.1-A_S905L2_MT7668_线刷固件包
移动魔百盒CM201-1_CW_S905L2_MT7668_线刷固件包
leetcode 48. Rotate Image 旋转图像(Medium)
寻找消失的类名
随机推荐
移动魔百盒CM201-1_CW_S905L2_MT7668_线刷固件包
如何提高员工积极性?
Minecraft HMCL 使用认证服务器LittleSkin进行登录
跨链桥已成行业最大安全隐患 为什么和怎么办
移动CM101s_MV100_EMMC_M8233_强刷后全分区线刷固件包
越来越火的图数据库到底能做什么?
寻找消失的类名
抖音最重要的接口——item_search_video-根据关键词获取视频列表
备战9月,美团50道软件测试经典面试题及答案汇总
机器学习(十七):网格搜索(Grid Search)和SVM
容器化 | 在 NFS 备份恢复 RadonDB MySQL 集群数据
全球电子产品需求萎靡:三星越南工厂大幅压缩产能,减少工人工作日
移动百事通BesTV_R3300-L_S905L_8189_线刷固件包
WEB 渗透之逻辑漏洞
广东移动魔百盒M411A _905L3_线刷固件包
jMeter Transaction Controller 学习笔记
Unity Apple登录接入
15天升级打怪,成为虚拟时尚创作者
在VMD上可视化hdf5格式的分子轨迹文件
HCIP WPN 实验