小数点进位 oracle,使用多个小数点(。)对Oracle中的记录进行排序
没有正则表达式和函数的解决方案(假设t是包含源数据的表):
select * from t
order by
(
select
sum(
to_number(substr(
sections,
decode(level,
1,1,
instr(sections, '.', 1, level-1)+1
),
decode(instr(sections, '.', 1, level),
0, length(sections),
instr(sections, '.', 1, level)
-
decode(level,
1,1,
instr(sections, '.', 1, level-1)+1
)
)
))
* power(1000, 10-level)
)
from dual
connect by instr(sections,'.',1,level-1) > 0
)
主要思想是计算数字,它表示每行的优先级。假设我们有33.17.21.2值。该字符串可以被视为数字系统中的数字,基数为Q,如十六进制数字表示IPv4地址,然后转换为数字表示:
33*(Q^3) + 17*(Q^2) + 21*(Q^1) + 2*(Q^0)
例如,如果Q=100,那么来自exmple的数字是
33*1000000 + 17*10000 + 21*100 + 2*1 = 33172102
这种方法的第一个问题是每个级别数要求低于选择Q值。这是设计上的,不能被扼杀。
接下来就是我们根本不知道有多少级别,我们有7.1和2.2.2.2.2.2,而最短的级别是第一个。因此,在计算值时,它从某个固定功率N开始,然后降低Q的功效,因此,如果Q=100和N=3多路复用器序列以这些数字开头:
1000000, 10000, 100, 1, 1/100, 1/10000, 1/1000000, ...
在Q=1000和N=10之上的代码中,但这可能会根据所需参数进行更改。
由选择的Q值和Oracle number类型的精度限制的级别数。从理论上讲,通过将字符串拆分成部分,可以为更长的字符串构建表达式。
其余代码只是用于将字符串拆分为数字序列的分层查询。
更新
同样的方法可以很容易地用于字符串:'20'出现在'8'之前,因为缺少关于第二个数字的信息。如果我们将这两个值填充到某个固定长度,它会按预期排序:'008' < '020',因此只能处理字符串:
select * from t order by
(
select
listagg(
lpad(
substr(
sections,
decode( level,
1,1,
instr(sections, '.', 1, level-1)+1
),
decode(instr(sections, '.', 1, level),
0, length(sections),
instr(sections, '.', 1, level)
-
decode(level,
1, 1,
instr(sections, '.', 1, level-1)+1
)
)
),
8,'0'
),
'-'
) within group (order by level)
from dual
connect by instr(sections,'.',1,level-1) > 0
)
字符串长度限制为4000个字符,每个级别有9个数字,单个分隔符号(上例中为'-'),可以处理400级别的层次结构。
这种方法的主要缺点是内存消耗和比较速度。
另一方面,如果没有转换为数字,即使使用混合章节编号也是如此(例如'13.3.a.vii'或'III.A.13.2'(Ooops ... roman numerals处理不当)
在十进制数的情况下,只有带字符串的编号变量可以通过将数字转换为十六进制表示来压缩。使用4个十六进制符号,可以在每个级别处理16535个数字,并且可以使用8个符号 - 完整的32位数字,这对于大多数应用来说已经足够了。
select * from t order by
(
select
listagg(
lpad(
trim(to_char(
to_number(substr(
sections,
decode( level,
1,1,
instr(sections, '.', 1, level-1)+1
),
decode(instr(sections, '.', 1, level),
0, length(sections),
instr(sections, '.', 1, level)
-
decode(level,
1, 1,
instr(sections, '.', 1, level-1)+1
)
)
)),
'XXXXXXXX'
)),
4,'0'
),
'-'
) within group (order by level)
from dual
connect by instr(sections,'.',1,level-1) > 0
)
P.S。当然,可以使用选择列表中的所有表达式来检查计算值,而不是在order by中使用它。
小数点进位 oracle,使用多个小数点(。)对Oracle中的记录进行排序相关推荐
- 截取小数点_五年级上册系列| 小数点位置变化名师微课+课本+学案,暑假预科,很香!...
点击蓝字关注我们 李艳玲工作室微课展播[总142期] 主讲教师:徐素平 电子课本 学 案 小数乘法 [学习目标] 1.熟练掌握小数点的移动引起小数大小变化的规律,并能举一反三,灵活运用. 2.自主探索 ...
- oracle只查询0点数据,Oracle 10g数据库基础之基本查询语句-中-函数
Oracle 10g数据库基础之基本查询语句-中-函数 --资料参考:张烈 张建中<数据库管理员培训讲义> 函数: 使用函数的目的是为了操作数据 将输入的变量处理,返回一个结果. 变量可以 ...
- oracle rdbms 占内存_027、Oracle数据库
1.数据库相关概念 (1)什么是数据库 所谓的数据库其实就是数据的集合.用户可以对集合中的数据进行新增.查询.更新. 删除等操作.数据库是以一定方式储存在一起.能与多个用户共享.具有尽可能小的冗余度. ...
- oracle字符界面安装,怎么解决oracle在linux 纯字符界面安装有关问题
之前在oracle 下面用图形装了(oracle图形界面安装遇到的问题), 毕竟图形界面用于个人使用,而服务器下的一般是字符界面,所以安又尝试字符界面的安装 我的环境是centos 6.3 64位 + ...
- oracle em 性能点不进,oracle em节点启动不成功问题处理总结
客户数据库项目从oracle 9i数据库升级到oracle10g后,oracle em在节点1启动不成功,节点2可以正常启动. 节点1启动时报错如下: [oracle@zhgsdb1 ~]$ emct ...
- ESX上ORACLE 10.2RAC(4.在REHAT4.7中安装ORACLE RAC)
四. 安装CRS软件 上传cluster软件到rac1,rac2的/home/oracle目录下 [root@rac1 ~]# cd /home/oracle [root@rac1 oracle]# ...
- oracle取得表中总记录数最快的方法
查询表中的记录总数的语法就是SELECT COUNT(*) FROM TABLE_NAME.这可能是最经常使用的一类SQL语句. 本文讨论怎样才能最快的得到这个记录数.本文纯粹主要是理论上的讨论,文章 ...
- oracle 字符集 自造字,循序渐进Oracle:自定义字符集的使用、更改字符集的内部方式及字符集更改的案例...
第3章 Oracle的字符集(3.9-3.11) Oracle全球支持(即Globalization Support)允许我们使用本地语言和格式来存储和检索数据.通过全球支持,Oracle可以支持多 ...
- oracle加as报错,【Oracle】-【sqlplus / as sysdba登录报错问题】-新用
[Oracle]-[sqlplus / as sysdba登录报错问题]-新用户使用sqlplus / as sysdba登录报错解决 [Oracle]-[sqlplus / as sysdba登录报 ...
最新文章
- Android专题-常用第三方框架
- Basis,去中心化央行?
- python软件界面-python软件界面介绍(python软件介绍)
- AIX 修 炼 之 路
- 【本站作品】机器学习数学基础专辑
- Struts2 简介
- 如何保证 HBase 服务的高可用?看看这份 HBase 可用性分析与高可用实践吧!
- E: Some index files failed to download. They have been ignored, or old ones used instead.解决方案
- k8s pod里访问不到外部ip_安全公告:影响所有K8s版本的设计缺陷
- ant design vue table 高度自适应_Vue.JS 实现拼拼乐小游戏项目
- Python题目:个人所得税计算
- 目标追踪拍摄?目标遮挡拍摄?拥有19亿安装量的花瓣app,究竟有什么别出心裁的功能如此吸引用户?
- 2019TFE计算机科学排名,美国留学|2019TFE Times 硕士专业排名
- js给网页中所有p元素添加onclick事件
- m序列码产生电路设计与仿真
- UE、UI、UCD、UED?你知道你是干啥的吗
- anaconda 创建虚拟环境(自己版本)
- [MODIS数据处理#8]批量将ET栅格的时间分辨率从8-day转换为monthly的一种思路
- C#全自动多线程上位机源码编程
- 学习是个过程——不断反复不断进步