楼主: lwp542

【大话IT】请问数字和字符怎么分开排序

[复制链接]
论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2015-1-18 00:51 | 显示全部楼层
〇〇 发表于 2015-1-18 00:50
没有处理非数字字符串的情况
SQL> CREATE TABLE t1(NAME VARCHAR2(20));

直接把字符和数字混合会出错
SQL> SELECT NAME FROM t1 ORDER BY decode(trim(translate(name,'0123456789',' ')),
null,to_number(name),name)
  2  /
SELECT NAME FROM t1 ORDER BY decode(trim(translate(name,'0123456789',' ')),null,
to_number(name),name)
       *
第 1 行出现错误:
ORA-01722: 无效数字


使用道具 举报

回复
论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2015-1-18 00:51 | 显示全部楼层
〇〇 发表于 2015-1-18 00:51
直接把字符和数字混合会出错
SQL> SELECT NAME FROM t1 ORDER BY decode(trim(translate(name,'01234567 ...

都转为字符串就可以了
SQL> SELECT NAME FROM t1 ORDER BY decode(trim(translate(name,'0123456789',' ')),
null,lpad(name,20,'0'),name)
  2  /

NAME
----------------------------------------
1
2
11
21
22
a
ab
abc

已选择8行。

SQL>

使用道具 举报

回复
论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2015-1-18 00:56 | 显示全部楼层
bell6248 发表于 2015-1-17 17:10
order by replace(translate(lower(notes), 'abcdefghijklmnopqrstuvwxyz', ' '), ' ', '') nulls last,  ...

你这个似乎错了
select * from t1
order by replace(translate(lower(name), 'abcdefghijklmnopqrstuvwxyz', ' '), ' ', '') nulls last,
replace(translate(name, '0123456789', ' '), ' ', '')  nulls last;
NAME
------------
1
11
2
21
22
a
ab
abc

已选择8行。

使用道具 举报

回复
论坛徽章:
27
双黄蛋
日期:2014-08-07 11:00:12红孩儿
日期:2015-01-09 11:06:52茶鸡蛋
日期:2015-01-09 11:14:31红宝石
日期:2015-02-03 10:25:36至尊黑钻
日期:2015-02-15 09:48:30至尊黑钻
日期:2015-02-15 09:49:11慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39暖羊羊
日期:2015-03-10 08:55:43慢羊羊
日期:2015-04-22 15:14:26
发表于 2015-1-18 20:55 | 显示全部楼层
〇〇 发表于 2015-1-18 00:51
都转为字符串就可以了
SQL> SELECT NAME FROM t1 ORDER BY decode(trim(translate(name,'0123456789','  ...

使用道具 举报

回复
论坛徽章:
9
2011新春纪念徽章
日期:2011-02-18 11:42:47ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11暖羊羊
日期:2015-03-04 14:50:372015年新春福章
日期:2015-03-06 11:57:31
 楼主| 发表于 2015-1-19 15:36 | 显示全部楼层
〇〇 发表于 2015-1-18 00:50
没有处理非数字字符串的情况
SQL> CREATE TABLE t1(NAME VARCHAR2(20));

多谢,靠谱。

使用道具 举报

回复
论坛徽章:
4
优秀写手
日期:2014-08-15 06:00:132015年新春福章
日期:2015-03-04 14:55:132015年新春福章
日期:2015-03-06 11:59:47慢羊羊
日期:2015-04-08 13:42:29
发表于 2015-1-22 08:02 | 显示全部楼层
直接order by  数字就会在前面,字母在后面的吧

使用道具 举报

回复
论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2015-1-22 08:51 来自手机 | 显示全部楼层
372369432 发表于 2015-1-22 08:02
直接order by  数字就会在前面,字母在后面的吧

但是把数值按ascii码排序

使用道具 举报

回复
论坛徽章:
3
优秀写手
日期:2014-12-25 06:00:032015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31
发表于 2015-1-22 09:18 | 显示全部楼层
with tmp as
    ( select to_char(level) as col from dual connect by level <= 2      
      union all select '11' from dual
      union all select '21' from dual
      union all select '22' from dual
      union all select 'a' from dual
      union all select 'ab' from dual      
      union all select 'abc' from dual),
a as
    ( select col
        from tmp      
       where regexp_like(col,'[[:digit:]]')     
       order by to_number(col)),
b as
    ( select col
        from tmp      
       where regexp_like(col,'[^[:digit:]]')     
       order by col )
select col from a
union all select col from b;

使用道具 举报

回复
论坛徽章:
3
优秀写手
日期:2014-12-25 06:00:032015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31
发表于 2015-1-22 09:24 | 显示全部楼层
如果数据里面有数字和字母混合的数据,如'1b',可以这样写
with tmp as
    ( select to_char(level) as col from dual connect by level <= 2      
      union all select '11' from dual
      union all select '21' from dual
      union all select '22' from dual
      union all select '1b' from dual
      union all select 'a' from dual
      union all select 'ab' from dual      
      union all select 'abc' from dual),
b as
    ( select col
        from tmp      
       where regexp_like(col,'[^[:digit:]]')     
       order by col ),            
a as
    ( select col from ( select col from tmp minus select col from b ) order by to_number(col) )
select col from a
union all select col from b;      

使用道具 举报

回复
认证徽章
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
发表于 2015-1-22 09:47 | 显示全部楼层
SELECT NAME
FROM   t1
ORDER BY CASE WHEN REGEXP_LIKE(NAME,'^[0-9]*$') THEN TO_NUMBER(NAME) END, NAME ;
NAME
--------------------
1
2
11
21
22
1a
a
ab
abc

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时9.5折

【架构革新 高效可控】2020年8月17日~19日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表