汉字数字混合排序

1、正则表达式

这种情况,只能满足汉字部分相同,且只有一个数字部分的排序,如 

排序前   排序后
电话1    电话1
电话13   电话2
电话16   电话4
电话2    电话6
电话4    电话13
电话6    电话16

 

select A.D, to_number(regexp_substr(D,'[0-9]*[0-9]',1))
from (SELECT '电话1' AS D
          FROM DUAL
        UNION
        SELECT '电话4'
          FROM DUAL
        UNION
        SELECT '电话2'
          FROM DUAL
        UNION
        SELECT '电话16'
          FROM DUAL
        UNION
        SELECT '电话13'
          FROM DUAL
        UNION
        SELECT '电话6'
          FROM DUAL) A  order by  to_number(regexp_substr(D,'[0-9]*[0-9]',1))

 

 

2、使用replace和translate处理后排序

使用replace和translate将汉字和数字剥离,并将数字规范成相同位数的字符串,如1,2,11,12,规范成01,02,11,12,然后将汉字部分和规范后的字符串连接起来排序。

这中情况可以满足汉字部分不同,数字部分只有一个的情况。

排序前      排序后
地址1       地址1   
地址14      地址3   
地址3       地址14  
电话1       电话1   
电话13      电话2   
电话2       电话13  
电话地址1   电话地址1
电话地址23  电话地址4
电话地址4   电话地址23

 

SELECT *
FROM
(
SELECT '电话1'   DATA   FROM DUAL UNION
SELECT '电话13'     FROM DUAL UNION
SELECT '电话2'      FROM DUAL UNION
SELECT '地址1'      FROM DUAL UNION
SELECT '地址14'     FROM DUAL UNION
SELECT '地址3'      FROM DUAL UNION
SELECT '电话地址1'  FROM DUAL UNION
SELECT '电话地址23' FROM DUAL UNION
SELECT '电话地址4'  FROM DUAL
)A
ORDER BY   REPLACE(TRANSLATE(DATA,'0123456789', '##########'), '#', '')||
       TO_CHAR(TO_NUMBER(REPLACE(DATA,  REPLACE(TRANSLATE(DATA, '0123456789', '##########'),
                                 '#', ''), '') ),'0009999')

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值