当前位置:   article > 正文

Oracle——复杂排序以及排序分页后可能出现的问题_oracle 分页问题

oracle 分页问题

前言

相信很多人看到文章这个标题,心里第一个想法就是:

排序不就是order by xxx就可以了嘛,这有啥好写的?

虽然排序的确是使用order by进行排序,但是在Oracle中存在其他很好玩的一些东西,特写博客做记录。

按照汉字首字母排序nlssort(xxx,‘NLS_SORT=SCHINESE_PINYIN_M’)

比如说有个需求:

查询到的数据结果集,按照银行首字母正序排序

那么伪SQL可以这么写:

select * from xxx t order by nlssort(t.bank_name,'NLS_SORT=SCHINESE_PINYIN_M')
  • 1

按照汉字笔画排序nlssort(xxx,‘NLS_SORT=SCHINESE_STROKE_M’)

比如有个需求:

查询到的数据结果集,按照银行汉字笔画正序排序

那么伪SQL可以写成这样:

select * from xxx t order by nlssort(t.bank_name,'NLS_SORT=SCHINESE_STROKE_M')
  • 1

按照汉字部首排序nlssort(xxx,‘NLS_SORT=SCHINESE_RADICAL_M’)

比如有个需求:

查询到的数据结果集,按照银行汉字部首正序排序

那么伪SQL可以写成这样:

select * from xxx t order by nlssort(t.bank_name,'NLS_SORT=SCHINESE_RADICAL_M')
  • 1

扩充排序

decode 转换后排序

除了上面采取nlssort进行恶心操作排序之外,还能使用deocde()进行排序。
比如下面的这个需求:

币种按照首字母正序排序,但是人民币必须排第一

那么实现方式也很好玩,可以先维护一个配置表或者虚拟表,将币种信息进行配置,然后采取如下方式排序:

SELECT * FROM DM_PARA_CONFIG dpc WHERE PARA_CODE=200030 
ORDER BY nlssort( decode(para_val,'人民币''aaaaa','NLS_SORT=SCHINESE_PINYIN_M')
  • 1
  • 2

思路很新奇:

人民币转化为aaaaaa,然后拼音排序,也就是 汉字首字母排序

排序中的空值问题

排序将空值放前面(nulls first)

select * from xxx t
order by t.bank_name nulls first
  • 1
  • 2

排序将空值放尾部(nulls first)

select * from xxx t
order by t.bank_name  nulls first
  • 1
  • 2

关于排序后分页处理数据不正确问题

SQL中的排序,需要讲究一个唯一顺序性,当在排序和分页操作时,若排序的字段不存在唯一性标识,则分页后,可能导致出现在第N页的数据,出现在了N+1页中的情况。

解决上述的排序问题也很简单:

增加新的排序字段,尽量靠近唯一的属性列,
如果数据库表中不存在唯一的列,则需要不断的去找,保证排序后数据记录顺序的唯一性。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/268623
推荐阅读
相关标签
  

闽ICP备14008679号