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

时间:2021-04-03 06:59:35
表中有一列的值类似这样,这列类型是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

15 个解决方案

#1


1A
101A 
11A

这三个数据,怎么排?

#2


引用 1 楼 wmxcn2000 的回复:
1A
101A 
11A

这三个数据,怎么排?


先不用考虑这种情况,数据表里如果有字符串的,就一定是字符串开头, 长远来看后面的数字也要按数值排序,现在也可以先按字符串排。即排成这样就行
A1
A101
A11

#3



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

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> 

#4


引用 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
 这个会有问题,是正则表达式的问题吗,该怎么写呢

#5


引用 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

#6


引用 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


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

#7



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> 

#8


引用 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会向这里传递一个变量即要排序的列,我没怎么用过正则,请多多指教。

#9


引用 8 楼 u011660664 的回复:
不好意思,可能没说清楚,我希望用一条通用语句来处理所有列的排序,就是这条语句可以对IP,  CPU,Nr进行按要求的排序,因为我在排序时mybatis会向这里传递一个变量即要排序的列,我没怎么用过正则,请多多指教。


你再细说一下规则吧,IP 地址是四段组成,可以分别拆开,后面两项,不分段;

#10


引用 9 楼 wmxcn2000 的回复:
Quote: 引用 8 楼 u011660664 的回复:


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


你再细说一下规则吧,IP 地址是四段组成,可以分别拆开,后面两项,不分段;


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列也好用

#11


引用 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 就可以了

#12


大佬们,我现在有这种情况。一个数据库里面某个字段是Varchar2型,里面是存放着某种设备名称。
由于场景不同,给设备命名的方式也不一样,比如:
有些客户量少,他们喜欢用文字或者拼音,文字或者拼音+数字,
有的大批量的则采用数字来命名,那么在web页面来显示的时候量少的客户无论你怎么排序,他们没影响,
但大批量的客户则要求必须按照他们命名的数字来排序,
请问这种情况该如何解决?

#13


引用 12 楼 CMCC_IOT 的回复:
大佬们,我现在有这种情况。一个数据库里面某个字段是Varchar2型,里面是存放着某种设备名称。
由于场景不同,给设备命名的方式也不一样,比如:
有些客户量少,他们喜欢用文字或者拼音,文字或者拼音+数字,
有的大批量的则采用数字来命名,那么在web页面来显示的时候量少的客户无论你怎么排序,他们没影响,
但大批量的客户则要求必须按照他们命名的数字来排序,
请问这种情况该如何解决?

举几个例子

#14


引用 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 就可以了



order by regexp_substr(name,'^\d+',1) +0 nulls last,   可以帮忙解释下+0是什么意思吗  看到正则表达式用于排序感觉好厉害

#15


引用 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 就可以了



order by regexp_substr(name,'^\d+',1) +0 nulls last,   可以帮忙解释下+0是什么意思吗  看到正则表达式用于排序感觉好厉害

加0,就是把字符串转化成数值型。

#1


1A
101A 
11A

这三个数据,怎么排?

#2


引用 1 楼 wmxcn2000 的回复:
1A
101A 
11A

这三个数据,怎么排?


先不用考虑这种情况,数据表里如果有字符串的,就一定是字符串开头, 长远来看后面的数字也要按数值排序,现在也可以先按字符串排。即排成这样就行
A1
A101
A11

#3



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

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> 

#4


引用 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
 这个会有问题,是正则表达式的问题吗,该怎么写呢

#5


引用 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

#6


引用 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


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

#7



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> 

#8


引用 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会向这里传递一个变量即要排序的列,我没怎么用过正则,请多多指教。

#9


引用 8 楼 u011660664 的回复:
不好意思,可能没说清楚,我希望用一条通用语句来处理所有列的排序,就是这条语句可以对IP,  CPU,Nr进行按要求的排序,因为我在排序时mybatis会向这里传递一个变量即要排序的列,我没怎么用过正则,请多多指教。


你再细说一下规则吧,IP 地址是四段组成,可以分别拆开,后面两项,不分段;

#10


引用 9 楼 wmxcn2000 的回复:
Quote: 引用 8 楼 u011660664 的回复:


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


你再细说一下规则吧,IP 地址是四段组成,可以分别拆开,后面两项,不分段;


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列也好用

#11


引用 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 就可以了

#12


大佬们,我现在有这种情况。一个数据库里面某个字段是Varchar2型,里面是存放着某种设备名称。
由于场景不同,给设备命名的方式也不一样,比如:
有些客户量少,他们喜欢用文字或者拼音,文字或者拼音+数字,
有的大批量的则采用数字来命名,那么在web页面来显示的时候量少的客户无论你怎么排序,他们没影响,
但大批量的客户则要求必须按照他们命名的数字来排序,
请问这种情况该如何解决?

#13


引用 12 楼 CMCC_IOT 的回复:
大佬们,我现在有这种情况。一个数据库里面某个字段是Varchar2型,里面是存放着某种设备名称。
由于场景不同,给设备命名的方式也不一样,比如:
有些客户量少,他们喜欢用文字或者拼音,文字或者拼音+数字,
有的大批量的则采用数字来命名,那么在web页面来显示的时候量少的客户无论你怎么排序,他们没影响,
但大批量的客户则要求必须按照他们命名的数字来排序,
请问这种情况该如何解决?

举几个例子

#14


引用 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 就可以了



order by regexp_substr(name,'^\d+',1) +0 nulls last,   可以帮忙解释下+0是什么意思吗  看到正则表达式用于排序感觉好厉害

#15


引用 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 就可以了



order by regexp_substr(name,'^\d+',1) +0 nulls last,   可以帮忙解释下+0是什么意思吗  看到正则表达式用于排序感觉好厉害

加0,就是把字符串转化成数值型。