You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 优先级分组:用1、2、3、4明确各分组的排序优先级,ASC排序后强制MB_BN→MB_B→MB_KOM→其他的顺序,彻底避免NULL值导致的顺序混乱。
  2. 简化字符串提取:SUBSTRING(location,7)替代原写法,因为MB_KOM是6个字符,从第7位开始均为数字,无需指定长度参数。
  3. 逻辑去重:优先级分组已经将MB_BN记录单独划分,第二个CASE中的MB_B%只会匹配不含MB_BN的记录,逻辑更清晰。

内容的提问来源于stack exchange,提问作者Edin Osmic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:25:24