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')