MySQL ORDER BY CASE WHEN排序不符合预期问题求助
解决MySQL排序不符合预期的问题
你的排序逻辑问题出在NULL值的排序优先级上:MySQL中ORDER BY ASC时,NULL会排在所有非NULL值的前面。
看你原语句的执行逻辑:
- 对于
MB_KOM开头的记录,前两个CASE都不匹配,返回NULL,而第一个CASE是ASC排序,这些NULL会直接排在有值的MB_BN记录前面,这就是MB_KOM结果跑最前面的原因。 - 另外,
MB_BN%其实也满足MB_B%的匹配条件,逻辑上存在重叠,容易引发排序混乱。
修正后的SQL语句
SELECT *, SUBSTRING(location, 7) AS ExtractString FROM inventory ORDER BY -- 先按分组优先级排序,确保整体顺序正确 CASE WHEN location LIKE 'MB_BN%' THEN 1 WHEN location LIKE 'MB_B%' THEN 2 WHEN location LIKE 'MB_KOM%' THEN 3 ELSE 4 END ASC, -- MB_BN分组内按location升序 CASE WHEN location LIKE 'MB_BN%' THEN location END ASC, -- MB_B分组内按location升序(已通过优先级过滤掉MB_BN记录) CASE WHEN location LIKE 'MB_B%' THEN location END ASC, -- MB_KOM分组内按提取的数字降序 CASE WHEN location LIKE 'MB_KOM%' THEN ExtractString + 0 END DESC
关键调整说明
- 优先级分组:用1、2、3、4明确各分组的排序优先级,ASC排序后强制
MB_BN→MB_B→MB_KOM→其他的顺序,彻底避免NULL值导致的顺序混乱。 - 简化字符串提取:
SUBSTRING(location,7)替代原写法,因为MB_KOM是6个字符,从第7位开始均为数字,无需指定长度参数。 - 逻辑去重:优先级分组已经将
MB_BN记录单独划分,第二个CASE中的MB_B%只会匹配不含MB_BN的记录,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Edin Osmic
相关产品推荐
相关产品推荐

