SQL语句:如何让字符串转化数字
和前端联调的时候,突然出现⼀个状况,新增数据的时候,⼀直报系统错误,写下此⽂,留以后反复温习。菜鸟程序员⼀名~
项⽬内容:新增产品信息
具体实现:1 获取基础信息,创建产品(调⽤接⼝传⼊的产品类型,如A作为编号的开头标识)【此时还未添加⾄数据库】
     2 填⼊其他信息(产品名称等)
     3 保存所有信息【此时添加⾄数据库】
在创建产品的时候需要返【产品编号】这个信息给前端,这个编号是在已有产品中取最⼤编号递增,已有的编号以产品类型编号字符为开头,如 A 第⼀个产品为A001,第⼆个产品
之前⽼代码设计的时候没想过如果个数⼤于999了如何处置,所以我遇上了A999,新增⼀个产品后,没什么问题,但是再曾⼀个产品的时候,问题来了,之前的sql语句查出来的最⼤编号是A999,所以创建产品的时候是A1000,但是A1000已经存在了!
* 之前的sql:
SELECT max(product_no)
FROM product_info
WHERE product_type='A'sql 字符串转数组
结果:A999
因为字符串⽐较是从左到右的,所以从第⼆个字符开始,9都是最⼤的,因此A999是最⼤的字符
所以我们要把数字那⼀块按照正常数字⽐较⼤⼩,⽽不是按着字符串⽐较
那么遇到两个问题:1 截取字串('A999'---截取---'999')
         2 转换成数字('999'---转换---999)
解决【问题⼀:截取字串处理】
SUBSTR(string,start_position,[length])  求⼦字符串,返回字符串
 a、substr("A123", 1);//返回:A123,截取所有字符;
 b、substr("A123", 2);//返回:123,截取从1开始之后所有字符;
 c、substr("A123", 2, 2);//返回:12,截取从1开始2个字符;
 d、substr("A123", 1, 100);//返回:A123,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最⼤数量返回;
 e、substr("A123", -3);//返回:123,注意参数-3,为负值时表⽰从尾部开始算起,字符串排列位置不变;
解决【问题⼆:转换成数字】
了很多基本上都是说⽤convert(int,字段名)或者 cast(字段名 as int) 函数对的,但是这样写完全错误
终于到了正确的写法:
a、SELECT CAST('123' AS SIGNED integer);
b、SELECT CONVERT('123',SIGNED);
c、SELECT '123'+0; // 嘻嘻,c 的写法有点粗鄙,但也还中⽤~
⼀直不到正确的函数⽤法,所以⽤了c写法,今天细细回顾,再多加搜寻资料的时候解决了~
最终的sql语句:
SELECT product_no
FROM product_info
WHERE product_type='A'
ORDER BY CONVERT(SUBSTR(product_no,2), SIGNED) DESC LIMIT 1
结果:A1000
开熏

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。