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

Oracle中如何提取'-'后的数字并对混合字符串按指定规则排序

SQL自定义排序调整方案

你原来的SQL仅处理了横杠前的数字部分,未对横杠后的数字做数值排序,同时没有将纯字母类字符串统一后置,因此无法得到预期结果。

调整后的SQL如下(适配Oracle、PostgreSQL等支持正则函数的数据库):

SELECT column
FROM your_table
ORDER BY
  -- 区分数字格式串和纯字母串,数字类全部前置
  CASE WHEN REGEXP_LIKE(column, '^\d+-\d+$') THEN 0 ELSE 1 END ASC,
  -- 按横杠前的数字升序排序
  TO_NUMBER(REGEXP_SUBSTR(column, '^\d+')) ASC,
  -- 按横杠后的数字升序排序,解决字符串排序中10排在2前的问题
  TO_NUMBER(REGEXP_SUBSTR(column, '\d+$')) ASC,
  -- 纯字母串按字典序自然排序
  column ASC;

如果是MySQL环境,只需把REGEXP_LIKE(column, '^\d+-\d+$')替换为column REGEXP '^[0-9]+-[0-9]+$'即可,其余排序逻辑完全一致。

排序逻辑说明

  • 第一层排序:用正则判断字符串是否为数字-数字格式,符合的返回0排在前面,纯字母的返回1排在后面
  • 第二层排序:提取横杠前的所有数字转为数值排序,保证前缀数字小的排在前面,比如1101开头的所有串排在1104开头的串前
  • 第三层排序:提取横杠后的所有数字转为数值排序,避免字符串排序时10出现在2前面的问题
  • 第四层排序:纯字母的字符串直接按原字段的字典序排序,刚好符合abc → pulse → shock的预期顺序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:18:03