解决 Order By 将字符串类型的数字 或 字符串中含数字 按数字排序问题
oracle数据库,字段是varchar2类型即string,而其实存的是数字,这时候不加处理的order by的排序结果,肯定有问题
解决办法:
(1)cast( 要排序的字段名 as integer) ,注意 integer 小写
(2)to_number (要排序的字段名)
如以下例子:
表数据与结构: salary 为 varchar 类型
create table TEST_ROW_NUMBER_OVER(
id varchar(10) not null,
name varchar(10) null,
age varchar(10) null,
salary varchar(10) null
);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a',10,'8000');
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a2',11,'6500');
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b',12,'13000');
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b2',13,'4500');
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c',14,'3000');
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c2',15,'20000');
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(4,'d',16,'30000');
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(5,'d2',17,'1800');
以 salary 降序:
select id,name,age,salary,row_number()over(order by salary desc) rank
from TEST_ROW_NUMBER_OVER t
结果:
此结果根本不符合我们的预期:
解决办法一:改写:order by cast(salary as integer) desc
select id,name,age,salary,row_number()over(order by cast(salary as integer) desc) rank
from TEST_ROW_NUMBER_OVER t
结果: 从结果看出,已经达到预期
增加一行字符串double数据
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(5,'d2',17,'1888.88');
再执行
select id,name,age,salary,row_number()over(order by cast(salary as integer) desc) rank
from TEST_ROW_NUMBER_OVER t
结果:结果表明在 oracle 中 不论是 integer还是duoble 的 varchar 类型数据,都可以 通过 cast ( 字段名 as integer ) 解决排序问题
解决办法二:order by to_number(salary) desc
select id,name,age,salary,row_number()over(order by to_number(salary) desc) rank
from TEST_ROW_NUMBER_OVER t
结果:从结果看出,to_number 也一样有效
再增加两行数据:salary中含中文及数字,按数字进行排序
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(6,'e1',20,'李雷2333');
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(7,'e2',21,'张三23333');
排序:order by to_number(regexp_substr(salary,'[0-9]*[0-9]',1)) desc ,regexp_substr 为截取方法,1为起始位置
select id,name,age,salary,row_number()over
(order by to_number(regexp_substr(salary,'[0-9]*[0-9]',1)) desc) rank
from TEST_ROW_NUMBER_OVER t
结果:
REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr :需要进行正则处理的字符串
__pattern :进行匹配的正则表达式
__position :起始位置,从第几个字符开始正则表达式匹配(默认为1)
__occurrence :标识第几个匹配组,默认为1
__modifier :模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)
转自:https://blog.csdn.net/qq_25221835/java/article/details/82768375
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库