﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-ljy932</title><link>http://www.blogjava.net/ljy932/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:04:51 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:04:51 GMT</pubDate><ttl>60</ttl><item><title>oracle排序（转太阳雨）</title><link>http://www.blogjava.net/ljy932/archive/2010/06/07/322949.html</link><dc:creator>流浪</dc:creator><author>流浪</author><pubDate>Mon, 07 Jun 2010 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/ljy932/archive/2010/06/07/322949.html</guid><wfw:comment>http://www.blogjava.net/ljy932/comments/322949.html</wfw:comment><comments>http://www.blogjava.net/ljy932/archive/2010/06/07/322949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljy932/comments/commentRss/322949.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljy932/services/trackbacks/322949.html</trackback:ping><description><![CDATA[<div class="postText"><strong>一、中文排序&nbsp;&nbsp; </strong><br />
&nbsp;&nbsp; 1.按照笔划排序&nbsp;<br />
<br />
&nbsp;&nbsp; select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;2.按照部首排序&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;3.按照拼音排序，此为系统的默认排序方式&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;PS:<br />
&nbsp;&nbsp;&nbsp;&nbsp;另外Oracle的排序不稳定，容易在分页中出现重复数据，解决的办法为在排序条件中，增加一个唯一值的字段<br />
&nbsp;&nbsp;&nbsp;&nbsp;nlssort函数在Hibernate的方言中也支持：）<br />
<br />
<strong>二、排序字段为空<br />
</strong>&nbsp;&nbsp; 1、缺省处理&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Oracle在Order by 时缺省认为null是最大值，所以如果是ASC升序则排在最后，DESC降序则排在最前&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;2、使用nvl函数&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;nvl函数可以将输入参数为空时转换为一特定值，如&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;nvl(employee_name,&#8217;张三&#8217;)表示当employee_name为空时则返回&#8217;张三&#8217;，如果不为空则返回employee_name&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;通过这个函数可以定制null的排序位置。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;3、使用decode函数&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;decode函数比nvl函数更强大，同样它也可以将输入参数为空时转换为一特定值，如&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;decode(employee_name,null,&#8217;张三&#8217;, employee_name)表示当employee_name为空时则返回&#8217;张三&#8217;，如果不为空则返回employee_name&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;通过这个函数可以定制null的排序位置。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;DECODE函数是ORACLE PL/SQL是功能强大的函数之一，目前还只有ORACLE公司的SQL提供了此函数，其他数据库厂商的SQL实现还没有此功能。DECODE有什么用途呢？先构造一个例子，假设我们想给智星职员加工资，其标准是：工资在8000元以下的将加20％；工资在8000元以上的加15％，通常的做法是，先选出记录中的工资字段值? select salary into var-salary from employee，然后对变量var-salary用if-then-else或choose case之类的流控制语句进行判断。如果用DECODE函数，那么我们就可以把这些流控制语句省略，通过SQL语句就可以直接完成。如下：select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee 是不是很简洁？ DECODE的语法：DECODE(value,if1,then1,if2,then2,if3,then3,...,else)，表示如果value 等于if1时，DECODE函数的结果返回then1,...,如果不等于任何一个if值，则返回else。初看一下，DECODE 只能做等于测试，但刚才也看到了，我们通过一些函数或计算替代value，是可以使DECODE函数具备大于、小于或等于功能。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;4、使用case语法&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Case语法是Oracle 9i后开始支持的，是一个比较灵活的语法，同样在排序中也可以应用 <br />
如： <br />
select <br />
&nbsp; * <br />
&nbsp;&nbsp; from employee <br />
&nbsp;&nbsp;&nbsp;&nbsp; order by&nbsp; (case employee_name <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; when null then <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '张三' <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; employee_name <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;表示当employee_name为空时则返回&#8217;张三&#8217;，如果不为空则返回employee_name <br />
通过case语法同样可以定制null的排序位置。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;5、使用nulls first或者nulls last语法&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Nulls first和nulls last是Oracle Order by支持的语法&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果Order by 中指定了表达式Nulls first则表示null值的记录将排在最前(不管是asc 还是 desc)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果Order by 中指定了表达式Nulls last则表示null值的记录将排在最后 (不管是asc 还是 desc)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;使用语法如下：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;--将nulls始终放在最前&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;select * from zl_cbqc order by cb_ld nulls first&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;--将nulls始终放在最后&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;select * from zl_cbqc order by cb_ld desc nulls last </div>
<img src ="http://www.blogjava.net/ljy932/aggbug/322949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljy932/" target="_blank">流浪</a> 2010-06-07 10:25 <a href="http://www.blogjava.net/ljy932/archive/2010/06/07/322949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>