SQL 对版本进行排序遇到的问题

背景

物料存在多个版本,我们每次只需要使用最新的版本

问题

  • 问题1:版本使用的是字符串,倒序排序,会导致 版本8 会排在版本11 前面
  • 问题2:版本version字符串既有数字字符串,也有字母字符串

解决思路

  • 对于数字字符串,需要将其转换成整数,
  • 字母字符串则转换成对应的ASCII码值

SQL语句

原本语句

sql 复制代码
    SELECT 
        material_code AS material_code_in,
        material_name AS material_name_in,
        '' AS material_type_in,
        material_class_small AS material_class_small_in,
        material_class_big AS material_class_big_in,
        erp_code AS erp_code_in,
        version AS version_in,
        unit AS unit_in
    FROM tbl_material_info 
    WHERE material_code IN ('P120','P525A','2070039115')

改写语句

sql 复制代码
WITH RankedMaterials AS (
    SELECT 
        material_code AS material_code_in,
        material_name AS material_name_in,
        '' AS material_type_in,
        material_class_small AS material_class_small_in,
        material_class_big AS material_class_big_in,
        erp_code AS erp_code_in,
        version AS version_in,
        unit AS unit_in,
        ROW_NUMBER() OVER (
            PARTITION BY material_code 
            ORDER BY 
                CASE 
                    WHEN TRY_CAST(version AS INT) IS NOT NULL THEN TRY_CAST(version AS INT) 
                    ELSE ASCII(SUBSTRING(version, 1, 1)) -- 将字母字符串转换为对应的ASCII码值
                END DESC
        ) AS rn
    FROM tbl_material_info 
    WHERE material_code IN ('P120','P525A','2070039115')
)
SELECT 
    material_code_in,
    material_name_in,
    material_type_in,
    material_class_small_in,
    material_class_big_in,
    erp_code_in,
    version_in,
    unit_in
FROM RankedMaterials
WHERE rn = 1;
相关推荐
宁波阿成1 分钟前
族谱管理系统架构分析与亮点总结
java·系统架构·vue·ruoyi-vue·族谱
lifewange2 分钟前
postman接口自动化如何进行参数化
数据库·自动化·postman
刘~浪地球7 分钟前
Redis 从入门到精通(三):键操作命令详解
数据库·redis·缓存
姬成韶10 分钟前
BUUCTF--[RoarCTF 2019]Easy Java
java·网络安全
组合缺一10 分钟前
Solon AI Harness 首次发版
java·人工智能·ai·llm·agent·solon
高梦轩35 分钟前
MySQL 故障排查与优化
数据库·mysql
AlunYegeer41 分钟前
MyBatis 传参核心:#{ } 与 ${ } 区别详解(避坑+面试重点)
java·mybatis
吴声子夜歌1 小时前
Node.js——操作MySQL数据库
数据库·mysql·node.js
爱丽_1 小时前
MySQL 锁等待与死锁进阶:怎么看等待、怎么降冲突(工程化套路)
数据库·mysql
少许极端1 小时前
算法奇妙屋(四十)-贪心算法学习之路7
java·学习·算法·贪心算法