赞
踩
相信很多人看到文章这个标题,心里第一个想法就是:
排序不就是
order by xxx
就可以了嘛,这有啥好写的?
虽然排序的确是使用order by
进行排序,但是在Oracle中存在其他很好玩的一些东西,特写博客做记录。
比如说有个需求:
查询到的数据结果集,
按照银行首字母正序
排序
那么伪SQL可以这么写:
select * from xxx t order by nlssort(t.bank_name,'NLS_SORT=SCHINESE_PINYIN_M')
比如有个需求:
查询到的数据结果集,
按照银行汉字笔画正序
排序
那么伪SQL可以写成这样:
select * from xxx t order by nlssort(t.bank_name,'NLS_SORT=SCHINESE_STROKE_M')
比如有个需求:
查询到的数据结果集,
按照银行汉字部首正序
排序
那么伪SQL可以写成这样:
select * from xxx t order by nlssort(t.bank_name,'NLS_SORT=SCHINESE_RADICAL_M')
除了上面采取nlssort
进行恶心操作排序之外,还能使用deocde()
进行排序。
比如下面的这个需求:
币种按照
首字母正序
排序,但是人民币必须排第一
。
那么实现方式也很好玩,可以先维护一个配置表或者虚拟表,将币种信息进行配置
,然后采取如下方式排序:
SELECT * FROM DM_PARA_CONFIG dpc WHERE PARA_CODE=200030
ORDER BY nlssort( decode(para_val,'人民币','aaaaa'),'NLS_SORT=SCHINESE_PINYIN_M')
思路很新奇:
将
人民币
转化为aaaaaa
,然后拼音排序,也就是汉字首字母排序
。
select * from xxx t
order by t.bank_name nulls first
select * from xxx t
order by t.bank_name nulls first
SQL中的排序,需要讲究一个唯一顺序性
,当在排序和分页操作时,若排序的字段不存在唯一性标识,则分页后,可能导致出现在第N页
的数据,出现在了N+1
页中的情况。
解决上述的排序问题也很简单:
增加新的排序字段,尽量靠近唯一的属性列,
如果数据库表中不存在唯一的列,则需要不断的去找,保证排序后数据记录顺序的唯一性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。