oracle 對查詢結果進行排序時,被排序的欄位存在null值,且要指定Null值排在最前面或者最後面,本文將介紹如何處理oracle 空值排序,需要的朋友可以參考下:
適用情況:
oracle 對查詢結果進行排序時,被排序的欄位存在null值,且要指定Null值排在最前面或者最後面
關鍵字:Nulls First;Nulls Last
預設情況:null 預設為最大值(即:asc 昇冪<小-->大>,null值排在最後;desc 降冪<大-->小>,null值排在最前面)
指定:
1.Oracle Order by支援的語法
2.指定Nulls first 則表示null值的記錄將排在最前(不管是asc 還是desc)
3.指定Nulls last 則表示null值的記錄將排在最後(不管是asc 還是desc)
語法舉例:(Table:Tab_A 有部分空值的欄位Col_A)
select * from Tab_A order by Tab_A. Col_A (asc/desc) nulls first------>null 值排在最前面
select * from Tab_A order by Tab_A. Col_A (asc/desc) nulls last ------>null 值排在最後面
其他方法:
在order by 的時候,用Nvl、NVL2 、Decode、case .....when....end;等函數對欄位的null值進行處理
例如:select * from Tab_A order by NVL(Tab_A. Col_A,'abc' ) (asc/desc);

 

對於Nvl()函數
如果是空值就替換成另一個值如nvl(欄位,‘x’)欄位值等於null就這個函數得到的結果就是'x',一般用於存在空值比較的情況下,比如欄位a與欄位b都是int型,其中一個等於null另一個為非空值,你使用a<>b是不成立的,
使用此條件查詢你將丟失這條本來不相等的資料,可以如此用法nvl(欄位,-1)<>nvl(欄位,-1),這樣就可以得到想要查詢的資料,當然查詢資料的前提是此欄位值不能有-1值才能用這種寫法。
對於NVL2函數
NVL2(expr1,expr2,expr3)
功能:如果參數運算式expr1值為Null,則NVL2()函數返回參數運算式expr3的值;如果參數運算式expr1值不為Null,則NVL2()函數返回參數運算式expr2的值。NVL( string1, replace_with) 功能:如果string1為Null,則
NVL函數返回replace_with的值,否則返回string1的值,如果兩個參數都為Null ,則返回Null。www.it165.net
以下為網上搜到的實際例子的另一種處理方式:
問題描述:
在處理一般的資料記錄中,對於數位類型的欄位,在oracle的排序中,預設把null值做為
大於任何數位的類型,當然對於Varchar2類型的欄位,預設也是該處理方式,但是客戶
要求排序的過程中,需要把null的欄位預設排在前邊(從小-->大)。一般的
order by xxxx,無法解決。

 

問題解決:
方案1:
可以使用複雜的使用sql:

 

 

01.select from
02.(select a.*,rownum as my_sys_rownum from (
03.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 
04.rownum<2000
05.and ZBRL is null
06. 
07.) a
08.union
09.select b.*,rownum+(select count(*) from (
10.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 
11.rownum<2000
12.and ZBRL is null
13. 
14.)) as my_sys_rownum from (
15.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 
16.rownum<2000
17.and ZBRL is not null order by ZBRL
18.) b
19.)
20.order by my_sys_rownum desc

 

方案2:
可以利用oracle中可以對order by中對比較欄位做設置的方式來實現:
如: ......order by nvl( aaa,’-1’)
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()