oracle 查詢結果對空值的排序


oracle 對查詢結果進行排序時,被排序的欄位存在null值,且要指定NULL值排在最前面或者最後面,本文將介紹如何處理oracle 空值排序,須要的朋友能夠參考下:sql

適用狀況: 
oracle 對查詢結果進行排序時,被排序的欄位存在null值,且要指定NULL值排在最前面或者最後面 oracle

關鍵字:Nulls First;Nulls Last ide

默認狀況:null 默認爲最大值(即:asc 升序<小-->大>,null值排在最後;desc 降序<大-->小>,null值排在最前面) 函數

指定: 
1.Oracle Order by支持的語法 
2.指定Nulls first 則表示null值的記錄將排在最前(無論是asc 仍是desc) 
3.指定Nulls last 則表示null值的記錄將排在最後(無論是asc 仍是desc) code

語法舉例:(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); string


對於Nvl()函數
若是是空值就替換成另外一個值如nvl(字段,‘x’)字段值等於null就這個函數獲得的結果就是'x',通常用於存在空值比較的狀況下,好比字段a與字段b都是int型,其中一個等於null另外一個爲非空值,你使用a<>b是不成立的,it

使用此條件查詢你將丟失這條原本不相等的數據,能夠如此用法nvl(字段,-1)<>nvl(字段,-1),這樣就能夠獲得想要查詢的數據,固然查詢數據的前提是此字段值不能有-1值才能用這種寫法。io

對於NVL2函數
NVL2(expr1,expr2,expr3)   
功能:若是參數表達式expr1值爲NULL,則NVL2()函數返回參數表達式expr3的值;若是參數表達式expr1值不爲NULL,則NVL2()函數返回參數表達式expr2的值。NVL( string1, replace_with) 功能:若是string1爲NULL,則ast

NVL函數返回replace_with的值,不然返回string1的值,若是兩個參數都爲NULL ,則返回NULL。

如下爲網上搜到的實際例子的另外一種處理方式:

問題描述:
在處理通常的數據記錄中,對於數字類型的字段,在oracle的排序中,默認把null值作爲
大於任何數字的類型,固然對於varchar2類型的字段,默認也是該處理方式,可是客戶
要求排序的過程當中,須要把null的字段默認排在前邊(從小-->大)。通常的
order by xxxx,沒法解決。

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

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方案2:能夠利用oracle中能夠對order by中對比較字段作設置的方式來實現:  如:  ……order by nvl( aaa,’-1’)

相關文章
相關標籤/搜索