邪恶八进制信息安全团队技术讨论组's Archiver

pub!1c 2006-1-17 12:23

[转载]oracle中关于null排序的问题

<P>文章作者:shaokun305</P>
<P><SPAN id=ArticleContent1_ArticleContent1_lblContent><SPAN id=ArticleContent1_ArticleContent1_lblContent> </P>
<P><STRONG>问题描述:<BR></STRONG>在处理一般的数据记录中,对于数字类型的字段,在oracle的排序中,默认把null值做为大于任何数字的类型,当然对于varchar2类型的字段,默认也是该处理方式,但是客户要求排序的过程中,需要把null的字段默认排在前边(从小-->大)。一般的<BR>order by xxxx,无法解决。</P>
<P><STRONG>问题解决:</STRONG><BR><FONT color=#0000ff>方案1:<BR></FONT>可以使用复杂的使用sql:</P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>select * from
(select a.*,rownum as my_sys_rownum from (
select deptid,nvl(BDZNAME,' '),nvl(VOLLEVEL,'0'),ZBRL,nvl(ZBTS, '0'),
nvl(FZR,'0'),nvl(DEPTIDDES,' '),nvl(TEL,' '),nvl(RUNSTATEDES,' '),
nvl(ADDRESS,' '),BDZID from V_BDZ where  rownum<2000

and ZBRL is null

) a
union
select b.*,rownum+(select count(*) from (
select deptid,nvl(BDZNAME,' '),nvl(VOLLEVEL,'0'),ZBRL,nvl(ZBTS, '0'),
nvl(FZR,'0'),nvl(DEPTIDDES,' '),nvl(TEL,' '),nvl(RUNSTATEDES,' '),
nvl(ADDRESS,' '),BDZID from V_BDZ where  rownum<2000

and ZBRL is null

)) as my_sys_rownum from (
select deptid,nvl(BDZNAME,' '),nvl(VOLLEVEL,'0'),ZBRL,
nvl(ZBTS, '0'),nvl(FZR,'0'),
nvl(DEPTIDDES,' '),nvl(TEL,' '),nvl(RUNSTATEDES,' '),
nvl(ADDRESS,' '),BDZID from V_BDZ where  rownum<2000

and ZBRL is not null order by ZBRL
) b
)
order by my_sys_rownum desc</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P><FONT color=#0000ff>方案2:</FONT><BR>可以利用oracle中可以对order by中对比较字段做设置的方式来实现:<BR> 如: ……order by nvl( aaa,'-1')</SPAN></P></SPAN>

页: [1]
© 1999-2008 EvilOctal Security Team