如何将ASP中MSAccess SQL的CDbl与LEFT函数转换为MySQL
Access代码片段逻辑解释
这段代码的核心是把tblSU表的SUNum字段处理成双精度浮点数,具体逻辑如下:
- 先检查
SUNum的值是否为纯数字:通过IsNumeric([tblSU]![SUNum])完成判断 - 根据检查结果分支处理:
- 如果是纯数字,直接使用
SUNum的原始值 - 如果不是纯数字,就截取
SUNum中第一个-左侧的内容:InStr(1,[tblSU]![SUNum],'-')定位-在字符串里的起始位置(从第1位开始查找)Left(..., 位置-1)提取-之前的所有字符
- 如果是纯数字,直接使用
- 最后把上述处理结果转成双精度浮点数,通过
CDbl()完成类型转换
举个实际例子:
- 若
SUNum是123.45,直接转成123.45 - 若
SUNum是678-ABC,截取678后转成678.0
转换为MySQL语法
将Access特有的函数替换为MySQL对应语法,最终SQL如下:
SELECT DISTINCT trelMapSU.Site, trelMapSU.MapNum, tlkpSUTyp.SUTyp, tblSU.SUNum, tlkpSUDesc.SUDesc, CAST( IF( tblSU.SUNum REGEXP '^[0-9]+(\\.[0-9]+)?$', tblSU.SUNum, LEFT(tblSU.SUNum, LOCATE('-', tblSU.SUNum) - 1) ) AS DOUBLE ) FROM tlkpSUTyp -- 注意:原Access SQL缺失表关联的JOIN语句,需要补充比如JOIN trelMapSU、tblSU等关联条件才能正常执行
关键函数替换说明:
IsNumeric()→ 用正则REGEXP '^[0-9]+(\\.[0-9]+)?$'判断是否为数字(支持整数和小数)IIf()→ 替换为MySQL原生的IF()函数,语法逻辑一致InStr()→ 替换为LOCATE('-', tblSU.SUNum),参数顺序为「要查找的字符串」在前,「原字符串」在后CDbl()→ 用CAST(xxx AS DOUBLE)实现双精度浮点数转换
内容的提问来源于stack exchange,提问作者stanhook
相关产品推荐
相关产品推荐

