oracle中怎样对既有字符又有数字的字段排序

WendyCoding 2016-11-21 10:11:50
表中有一列的值类似这样,这列类型是NVARCHAR2, 怎样实现排序,使得数字是按照数值排序,同时字符串是按字母排序

column
11
1
2
12
test1:1; test2:2
aaa:2; bbb:3

排序后应为
column
1
2
11
12
aaa:2; bbb:3
test1:1; test2:2
...全文
1776 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
CMCC_IOT 2017-07-16
  • 打赏
  • 举报
回复
大佬们,我现在有这种情况。一个数据库里面某个字段是Varchar2型,里面是存放着某种设备名称。 由于场景不同,给设备命名的方式也不一样,比如: 有些客户量少,他们喜欢用文字或者拼音,文字或者拼音+数字, 有的大批量的则采用数字来命名,那么在web页面来显示的时候量少的客户无论你怎么排序,他们没影响, 但大批量的客户则要求必须按照他们命名的数字来排序, 请问这种情况该如何解决?
卖水果的net 2017-07-16
  • 打赏
  • 举报
回复
引用 14 楼 weixin_38847048的回复:
[quote=引用 11 楼 wmxcn2000 的回复:] [quote=引用 10 楼 u011660664 的回复:] IP按正常字符串排就行,先不考虑分段,比如这样就行 172.16.11.100 172.16.11.2 在第一次的回答中
 order by regexp_substr(name,'^\d+',1) +0 nulls last, name;
对于CPU和Nr是可以的,但IP列不能按字符串顺序排了,我在本机上用这条语句对IP逆序排序,结果是不对的。怎么修正这条语句使得对IP列也好用
逆序排序 ,加 desc 就可以了[/quote] order by regexp_substr(name,'^\d+',1) +0 nulls last, 可以帮忙解释下+0是什么意思吗 看到正则表达式用于排序感觉好厉害[/quote] 加0,就是把字符串转化成数值型。
花开了叫我 2017-07-16
  • 打赏
  • 举报
回复
引用 11 楼 wmxcn2000 的回复:
[quote=引用 10 楼 u011660664 的回复:] IP按正常字符串排就行,先不考虑分段,比如这样就行 172.16.11.100 172.16.11.2 在第一次的回答中
 order by regexp_substr(name,'^\d+',1) +0 nulls last, name;
对于CPU和Nr是可以的,但IP列不能按字符串顺序排了,我在本机上用这条语句对IP逆序排序,结果是不对的。怎么修正这条语句使得对IP列也好用
逆序排序 ,加 desc 就可以了[/quote] order by regexp_substr(name,'^\d+',1) +0 nulls last, 可以帮忙解释下+0是什么意思吗 看到正则表达式用于排序感觉好厉害
ghx287524027 2017-07-16
  • 打赏
  • 举报
回复
引用 12 楼 CMCC_IOT 的回复:
大佬们,我现在有这种情况。一个数据库里面某个字段是Varchar2型,里面是存放着某种设备名称。 由于场景不同,给设备命名的方式也不一样,比如: 有些客户量少,他们喜欢用文字或者拼音,文字或者拼音+数字, 有的大批量的则采用数字来命名,那么在web页面来显示的时候量少的客户无论你怎么排序,他们没影响, 但大批量的客户则要求必须按照他们命名的数字来排序, 请问这种情况该如何解决?
举几个例子
WendyCoding 2016-11-25
  • 打赏
  • 举报
回复
引用 7 楼 wmxcn2000 的回复:

SQL>
SQL> create table test(ip varchar(20));
Table created
SQL> begin
2 insert into test values('172.116.11.250');
3 insert into test values('171.116.111.250');
4 insert into test values('171.162.211.250');
5 insert into test values('172.162.211.250');
6 insert into test values('172.62.211.250');
7 end;
8 /
PL/SQL procedure successfully completed
SQL> select * from test
2 order by regexp_substr(ip,'[^.]+',1,1),regexp_substr(ip,'[^.]+',1,2);
IP
--------------------
171.116.111.250
171.162.211.250
172.116.11.250
172.162.211.250
172.62.211.250
SQL> drop table test purge ;
Table dropped

SQL>


不好意思,可能没说清楚,我希望用一条通用语句来处理所有列的排序,就是这条语句可以对IP, CPU,Nr进行按要求的排序,因为我在排序时mybatis会向这里传递一个变量即要排序的列,我没怎么用过正则,请多多指教。
卖水果的net 2016-11-25
  • 打赏
  • 举报
回复

SQL> 
SQL> create table test(ip varchar(20));
Table created
SQL> begin
  2      insert into test values('172.116.11.250');
  3      insert into test values('171.116.111.250');
  4      insert into test values('171.162.211.250');
  5      insert into test values('172.162.211.250');
  6      insert into test values('172.62.211.250');
  7  end;
  8  /
PL/SQL procedure successfully completed
SQL> select * from test
  2  order by regexp_substr(ip,'[^.]+',1,1),regexp_substr(ip,'[^.]+',1,2);
IP
--------------------
171.116.111.250
171.162.211.250
172.116.11.250
172.162.211.250
172.62.211.250
SQL> drop table test purge ;
Table dropped

SQL> 
WendyCoding 2016-11-25
  • 打赏
  • 举报
回复
引用 5 楼 wmxcn2000 的回复:
[quote=引用 4 楼 u011660664 的回复:]

如果其中一个字段是IP
172.16.11.250
172.16.11.251
想对IP倒序排列
order by regexp_substr(ip,'^\d+',1) +0 desc nulls last, ip
这个会有问题,是正则表达式的问题吗,该怎么写呢


你多给出一些数据,多种类型的 ,都是什么规则;

http://bbs.csdn.net/topics/391996442[/quote]

表中数据如图,要求能按照各列进行正反序排列,每列都是NVARCHAR2类型,其中CPU里既有所谓的数字又有字符串,Nr列里只有数字,CPU和Nr列里的数字要按照数值进行排列,CPU里字符串部分放到数字的后面就行

卖水果的net 2016-11-25
  • 打赏
  • 举报
回复
引用 4 楼 u011660664 的回复:
如果其中一个字段是IP 172.16.11.250 172.16.11.251 想对IP倒序排列
order by regexp_substr(ip,'^\d+',1) +0 desc nulls last, ip
这个会有问题,是正则表达式的问题吗,该怎么写呢
你多给出一些数据,多种类型的 ,都是什么规则; http://bbs.csdn.net/topics/391996442
WendyCoding 2016-11-25
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:

-- 目前,你这几行数据,可以这样写,你跑跑看

SQL> 
SQL> create table test(name nvarchar2(30));
Table created
SQL> begin
  2      insert into test values('11');
  3      insert into test values('1');
  4      insert into test values('2');
  5      insert into test values('12');
  6      insert into test values('test1:1; test2:2');
  7      insert into test values('aaa:2; bbb:3');
  8  end;
  9  /
PL/SQL procedure successfully completed
SQL> select name from test
  2  order by regexp_substr(name,'^\d+',1) +0 nulls last, name;
NAME
-------------------------------------------------------------
1
2
11
12
aaa:2; bbb:3
test1:1; test2:2
6 rows selected
SQL> drop table test purge;
Table dropped

SQL> 
如果其中一个字段是IP 172.16.11.250 172.16.11.251 想对IP倒序排列
order by regexp_substr(ip,'^\d+',1) +0 desc nulls last, ip
这个会有问题,是正则表达式的问题吗,该怎么写呢
卖水果的net 2016-11-25
  • 打赏
  • 举报
回复
引用 10 楼 u011660664 的回复:
IP按正常字符串排就行,先不考虑分段,比如这样就行 172.16.11.100 172.16.11.2 在第一次的回答中
 order by regexp_substr(name,'^\d+',1) +0 nulls last, name;
对于CPU和Nr是可以的,但IP列不能按字符串顺序排了,我在本机上用这条语句对IP逆序排序,结果是不对的。怎么修正这条语句使得对IP列也好用
逆序排序 ,加 desc 就可以了
WendyCoding 2016-11-25
  • 打赏
  • 举报
回复
引用 9 楼 wmxcn2000 的回复:
[quote=引用 8 楼 u011660664 的回复:] 不好意思,可能没说清楚,我希望用一条通用语句来处理所有列的排序,就是这条语句可以对IP, CPU,Nr进行按要求的排序,因为我在排序时mybatis会向这里传递一个变量即要排序的列,我没怎么用过正则,请多多指教。
你再细说一下规则吧,IP 地址是四段组成,可以分别拆开,后面两项,不分段;[/quote] IP按正常字符串排就行,先不考虑分段,比如这样就行 172.16.11.100 172.16.11.2 在第一次的回答中
 order by regexp_substr(name,'^\d+',1) +0 nulls last, name;
对于CPU和Nr是可以的,但IP列不能按字符串顺序排了,我在本机上用这条语句对IP逆序排序,结果是不对的。怎么修正这条语句使得对IP列也好用
卖水果的net 2016-11-25
  • 打赏
  • 举报
回复
引用 8 楼 u011660664 的回复:
不好意思,可能没说清楚,我希望用一条通用语句来处理所有列的排序,就是这条语句可以对IP, CPU,Nr进行按要求的排序,因为我在排序时mybatis会向这里传递一个变量即要排序的列,我没怎么用过正则,请多多指教。
你再细说一下规则吧,IP 地址是四段组成,可以分别拆开,后面两项,不分段;
WendyCoding 2016-11-22
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
1A 101A 11A 这三个数据,怎么排?
先不用考虑这种情况,数据表里如果有字符串的,就一定是字符串开头, 长远来看后面的数字也要按数值排序,现在也可以先按字符串排。即排成这样就行 A1 A101 A11
卖水果的net 2016-11-22
  • 打赏
  • 举报
回复
1A 101A 11A 这三个数据,怎么排?
卖水果的net 2016-11-22
  • 打赏
  • 举报
回复

-- 目前,你这几行数据,可以这样写,你跑跑看

SQL> 
SQL> create table test(name nvarchar2(30));
Table created
SQL> begin
  2      insert into test values('11');
  3      insert into test values('1');
  4      insert into test values('2');
  5      insert into test values('12');
  6      insert into test values('test1:1; test2:2');
  7      insert into test values('aaa:2; bbb:3');
  8  end;
  9  /
PL/SQL procedure successfully completed
SQL> select name from test
  2  order by regexp_substr(name,'^\d+',1) +0 nulls last, name;
NAME
-------------------------------------------------------------
1
2
11
12
aaa:2; bbb:3
test1:1; test2:2
6 rows selected
SQL> drop table test purge;
Table dropped

SQL> 

17,090

社区成员

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

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