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

解决 Order By 将字符串类型的数字 或 字符串中含数字 按数字排序问题的更多相关文章

  1. go语言基础之字符串类型 和 字符与字符串类型的区别

    1.字符串类型 示例1: package main //必须有一个main包 import "fmt" func main() { var str1 string str1 = & ...

  2. Python3:数字类型和字符串类型的相互转换

    Python3:数字类型和字符串类型的相互转换 一.python中字符串转换成数字 方法1: 类中进行导入:import string str='555'num=string.atoi(str)num ...

  3. Python03 字符串类型、强制类型转化、列表、元组、字典、集合

    1 字符串类型 在python中字符串类型用str表示,字符串的连接用 + 1.1 创建字符串对象 ·创建一个字符串对象有两种方式,一种方式是直接用字符串进行赋值,另外一种是利用str类实例化对象:具 ...

  4. python学习笔记(5-1)-基本数据类型-字符串类型及操作

    五.字符串处理函数  len(x):字符串x的长度.如len("12345")结果为5  str(x):任意类型x所对应的字符串形式. >>> str(123) ...

  5. Python基础数据类型(数字、字符串、布尔、列表、元组、字典、集合等)

    数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定 ...

  6. MySQL 避免使用字符串类型作为标识列

    避免使用字符串类型作为标识列: 消耗空间. 比数字类型慢(MyISAM 中对字符串使用压缩索引,查询会慢). 对于 MD5().UUID() 生成的随机字符串,这些值会分布在很大的空间内,导致 ins ...

  7. IT公司100题-18-圆圈中最后剩下的数字

    问题描述: n个数字(下标为0, 1, …, n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(当前数字从1开始计数).当一个数字被删除后,从被删除数字的下一个数字开始计数,继续删除 ...

  8. mysql中比较字符串类型数字

    操作的表: p.p1 { margin: 0; font: 16px Menlo; color: rgba(0, 0, 0, 1) } span.s1 { font-variant-ligatures ...

  9. python c++ 混合编程中python调用c++string返回类型的函数,python中返回为数字的解决办法

    本随笔解决 Python使用ctypes 调用c++dll 字符串返回类型函数,在python中显示为数字:原文解决方案见so: https://stackoverflow.com/questions ...

  10. Day2_数字类型_字符串类型_列表类型_元组_字典_集合_字符编码_文件处理

    数字类型: 作用:年纪,等级,薪资,身份证号等: 10进制转为2进制,利用bin来执行. 10进制转为8进制,利用oct来执行. 10进制转为16进制,利用hex来执行. #整型age=10 prin ...

随机推荐

  1. [转帖]详解:Linux Chrony 设置服务器集群同步时间

    https://www.linuxprobe.com/centos7-chrony-time.html 导读 Chrony是一个开源的自由软件,像CentOS 7或基于RHEL 7操作系统,已经是默认 ...

  2. [转帖]oom-killer错误排查过程

    https://www.cnblogs.com/hphua/p/16395893.html 1.遇到的问题:应用在hi3536上跑一段不固定的时间,随之就会出现重启的现象:打印如下: app-run ...

  3. [转帖]sudo 命令_su、sudo、sudo su、sudo -i的用法和区别

    sudo 命令 1.sudo 简介 sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户 ...

  4. Nginx被它打败了?

    Nginx被它打败了? 我们经常使用Nginx作为我们系统的代理,通常情况下是完全够用的,但是有时候业务的复杂性,我们也需要使用在网关中去代理中做一些业务,这个时候Nginx也可以使用lua脚本扩展, ...

  5. 插件时间格式处理moment如何使用

    第1步下载插件 cnpm i moment -S 第2步 在main.js中去使用 在main.js中 注册全局过滤器 fmtdata是等会你用的 可以自定义 fmtdata直接可以调用.是一个过滤器 ...

  6. 升级到win11 22h2的体验

    win11 22h2更稳定了 在win11 22h2发布后没多久,我就升级到了这个版本,截止目前已经使用半个月了,谈谈我的使用感受. 总体要比之前的版本更稳定,表现为笔记本风扇不会突然响,突然卡顿,不 ...

  7. 使用Lua做为MMOARPG游戏逻辑开发脚本的一点体会

    项目背景 目前在一个大型MMOARPG游戏中使用Lua做为逻辑开发语言,Lua占整体代码量的80%. 我们这个MMO游戏开发近2年,客户端8人,项目组总体人数在100人(美术占70%),目前代码量很大 ...

  8. 开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2等模型,开箱即用

    开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA.ChatGLM.UDA.GPT2等模型,开箱即用 1.介绍 TextGen实现了多种文本生成模型,包括:LLaMA.ChatGLM.UDA ...

  9. LLM面面观之RLHF平替算法DPO

    1. 背景 最近本qiang~老看到一些关于大语言模型的DPO.RLHF算法,但都有些云里雾里,因此静下心来收集资料.研读论文,并执行了下开源代码,以便加深印象. 此文是本qiang~针对大语言模型的 ...

  10. 影驰RTX 4070 SUPER星曜OC显卡评测:250W超频潜力十足 散热更惊喜

    一.前言:影驰推出主打高颜值的RTX 4070 SUPER星曜OC显卡 影驰作为DIY大厂,要说它家颜值最高的产品,那必然就是星曜系列,无论显卡.内存还是SSD,不光好看,品质和性能上也都有着不俗的表 ...