• SQL语句:如何让字符串转化数字


    和前端联调的时候,突然出现一个状况,新增数据的时候,一直报系统错误,写下此文,留以后反复温习。菜鸟程序员一名~

    项目内容:新增产品信息

    具体实现:1 获取基础信息,创建产品(调用接口传入的产品类型,如A作为编号的开头标识)【此时还未添加至数据库】

         2 填入其他信息(产品名称等)

         3 保存所有信息【此时添加至数据库】

    在创建产品的时候需要返【产品编号】这个信息给前端,这个编号是在已有产品中取最大编号递增,已有的编号以产品类型编号字符为开头,如 A 第一个产品为A001,第二个产品A002......

    之前老代码设计的时候没想过如果个数大于999了如何处置,所以我遇上了A999,新增一个产品后,没什么问题,但是再曾一个产品的时候,问题来了,之前的sql语句查出来的最大编号是A999,所以创建产品的时候是A1000,但是A1000已经存在了!

    * 之前的sql:

    SELECT max(product_no)
    FROM product_info
    WHERE product_type='A'

    结果: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

    开熏!!!!

  • 相关阅读:
    集训第六周 O题
    集训第六周 M题
    集训第六周 矩阵快速幂 K题
    集训第六周 数学概念与方法 计数 排列 L题
    集训第六周 数学概念与方法 J题 数论,质因数分解
    集训第六周 数学概念与方法 数论 线性方程 I题
    集训第六周 数学概念与方法 概率 N题
    HUAS Summer Contest#4 D题 DP
    集训第六周 数学概念与方法 数论 筛素数 H题
    C语言之六大排序算法
  • 原文地址:https://www.cnblogs.com/BulingBuling/p/9646676.html
Copyright © 2020-2023  润新知