sql语句中的字段排序问题(字段含字符和数字)

lean77 2005-07-12 03:05:23
用此句进行查询: select * from tb order by a
查询结果数据表的'a'这一列为如下:
8-1-15-6
9-1-1-1
9-1-1-11
9-1-1-3
9-1-10-2
9-1-2-8

其中用'-'间隔的各项数字,有1位,2位,3位数字的可能,

我想达到以下的排列结果,不知用什么sql语句可以实现?
8-1-15-6
9-1-1-1
9-1-1-3
9-1-1-11
9-1-2-8
9-1-10-2
...全文
299 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
guangli_zhang 2005-07-16
  • 打赏
  • 举报
回复
语句
select col,to_number(substr(col, 1, instr(col, '-') - 1)) a,
to_number(substr(col,
instr(col, '-') + 1,
instr(col, '-', 1, 2) - instr(col, '-') - 1)) b,
to_number(substr(col,
instr(col, '-' ,1, 2) + 1,
instr(col, '-', 1, 3) - instr(col, '-', 1, 2) - 1)) c,
to_number(substr(col,
instr(col, '-' ,1, 3) + 1,
100)) d

from t_test
order by a,b,c,d
结果
8-1-15-6 8 1 15 6
9-1-1-1 9 1 1 1
9-1-1-3 9 1 1 3
9-1-1-11 9 1 1 11
9-1-2-8 9 1 2 8
9-1-10-2 9 1 10 2
guangli_zhang 2005-07-16
  • 打赏
  • 举报
回复

select col,to_number(substr(col, 1, instr(col, '-') - 1)) a,
to_number(substr(col,
instr(col, '-') + 1,
instr(col, '-', 1, 2) - instr(col, '-') - 1)) b,
to_number(substr(col,
instr(col, '-' ,1, 2) + 1,
instr(col, '-', 1, 3) - instr(col, '-', 1, 2) - 1)) c,
to_number(substr(col,
instr(col, '-' ,1, 3) + 1,
100)) d

from t_test
order by a,b,c,d
lean77 2005-07-13
  • 打赏
  • 举报
回复
自己up
lean77 2005-07-13
  • 打赏
  • 举报
回复
如果允许输入字母的话,就没法排序
bzszp 2005-07-12
  • 打赏
  • 举报
回复
那样的话你写一个函数
将所有的处理都放在函数里面
比如函数名字叫fun(vin varchar2)
select a from tb order by fun(a);
lean77 2005-07-12
  • 打赏
  • 举报
回复
谢谢,看来只好规范输入了,必须输入三个'-'.


如果允许输入字母的话,就没法排序了,有没有什么办法?
bzszp 2005-07-12
  • 打赏
  • 举报
回复
是的
没有什么好办法了
lean77 2005-07-12
  • 打赏
  • 举报
回复
这种排序必须这个字段的值中含有三个'-',如果少了一个'-',就会报错
bzszp 2005-07-12
  • 打赏
  • 举报
回复
用以下语句监测
select a from tb where trim(translate(a,'0123456789-',' ')) is not null;
bzszp 2005-07-12
  • 打赏
  • 举报
回复
检查一下你的数据
是否包含非数字字符,或者全角字符
bzszp 2005-07-12
  • 打赏
  • 举报
回复
to_number(replace(name,'-',''))
不行。
如果数据是:
9-1-2-800
9-1-10-2
则应当还是9-1-2-800在前面
to_number后 的话,会认为9-1-2-800>9-1-10-2
bzszp 2005-07-12
  • 打赏
  • 举报
回复
SQL> select * from t;

NAME
----------
8-1-15-6
9-1-1-1
9-1-1-11
9-1-1-3
9-1-10-2
9-1-2-8

已选择6行。

已用时间: 00: 00: 00.70
SQL> select * from t order by to_number(substr(name,1,instr(name,'-')-1)),
2 to_number(substr(name,instr(name,'-')+1,instr(name,'-',1,2)-instr(name,'-')-1)),
3 to_number(substr(name,instr(name,'-',1,2)+1,instr(name,'-',1,3)-instr(name,'-',1,2)-1)),
4 to_number(substr(name,instr(name,'-',1,3)+1));

NAME
----------
8-1-15-6
9-1-1-1
9-1-1-3
9-1-1-11
9-1-2-8
9-1-10-2

已选择6行。

已用时间: 00: 00: 00.60
SQL>
lean77 2005-07-12
  • 打赏
  • 举报
回复
我想用这一句试试,
select a from tb order by to_number((replace(a,'-','')))

可是不知道为什么,报'ora-01722 无效数字'的错误!

大家看看要怎么写这一句sql语句?

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧