1. 程式人生 > >Oracle資料庫order by排序之null值處理方法

Oracle資料庫order by排序之null值處理方法


最近在忙活公司產品後臺的資料報表,在對業務資料排序時候,發現有些欄位的記錄是null值,這時排序便出現了有違我們使用習慣的資料大小順序問題。在Oracle中規定,在Order by排序時預設認為null是最大值,所以如果是ASC升序則被排在最後,而DESC降序則排在最前。所以,為何分析資料的直觀性方便性,我們需要對null的記錄值進行相應處理。
這是四種oracle排序中NULL值處理的方法:
1、使用nvl函式
語法:Nvl(expr1, expr2)
    若EXPR1是NULL,則返回EXPR2,否則返回EXPR1.
    SELECT NAME,NVL(TO_CHAR(COMM),'NOT APPLICATION') FROM TABLE1;
nvl函式可以在輸入引數為空時轉換為一特定值,如
nvl(person_name,“未知”)表示若person_name欄位值為空時返回“未知”,如不為空則返回person_name的欄位值。
通過這個函式可以定製null的排序位置。
2、使用decode函式
 
decode函式比nvl函式更強大,同樣它也可以將輸入引數為空時轉換為一特定值,如
decode(person_name,null,“未知”, person_name)表示當person_name為空時返回“未知”,如不為空則返回person_name的欄位值。
通過此函式也可以定製null的排序位置。

3、使用nulls first 或者nulls last 語法,最簡單常用的方法。

Nulls first和nulls last是Oracle Order by支援的語法
若Order by 中指定了表示式Nulls first則表示null值的記錄將排在最前(不管是asc 還是 desc)
若Order by 中指定了表示式Nulls last則表示null值的記錄將排在最後 (不管是asc 還是 desc)

使用方法舉例如下:
將nulls始終放在最前:
select * from tbl order by field nulls first

將nulls始終放在最後:
select * from tbl order by field desc nulls last

4、使用case 語法
 
Case語法是Oracle 9i後開始支援的,是一個比較靈活的語法,同樣在排序中也可以應用
如:
select *
 from students
 order by  (case person_name
            when null then
             '未知'
            else
             person_name
          end)
表示在person_name欄位值為空時返回’未知’,如果不為空則返回person_name
通過case語法同樣可以定製null的排序位置。
 

專案例項:

 	!defined('PATH_ADMIN') && exit('Forbidden');
	class mod_gcdownload
	{
		public static function get_gcdownload_datalist($start = 0,$rowsperpage = PAGE_ROWS, $datestart = '',$dateend = '',$ver = '',$coopid = '',$subcoopid = '',$sortfield = '', $sorttype = '', $pid = 123456789, $plat = 'abcdefg'){
			$sql = '';
			$condition = empty($datestart) ? " WHERE 1=1 " : " WHERE t.statistics_date >= '$datestart' AND t.statistics_date <= '$dateend'";
			if($ver)
			{
				$condition .= " AND t.edition='$ver'";
			}
			if($coopid)
			{
				$condition .= " AND t.suco_coopid=$coopid";
			}
			if($subcoopid)
			{
				$condition .= " AND t.suco_subcoopid=$subcoopid";
			}
			if($sortfield && $sorttype){
				$condition .= " ORDER BY t.{$sortfield} {$sorttype} NULLS LAST";
			}elseif($sortfield){
				$condition .= " ORDER BY t.{$sortfield} desc NULLS LAST";
			}else{
				$condition .= " ORDER BY t.statistics_date desc NULLS LAST";
			}
			$finish = $start + $rowsperpage;
			$joinsqlcollection = "(SELECT tc.coop_name, tsc.suco_name, tsc.suco_coopid,tsc.suco_subcoopid, s.edition, s.new_user, d.one_user, d.three_user, d.seven_user, s.statistics_date FROM (((pdt_stat_newuser_{$pid}_{$plat} s LEFT JOIN pdt_days_dl_remain_{$pid}_{$plat} d ON s.statistics_date=d.new_date AND s.subcoopid=d.subcoopid AND s.edition=d.edition )LEFT JOIN 
[email protected]
@JTINFO tsc ON s.subcoopid=tsc.suco_subcoopid) LEFT JOIN [email protected]@JTINFO tc ON tsc.suco_coopid=tc.coop_id))"; $sql = "SELECT * FROM (SELECT tb_A.*, ROWNUM AS rn FROM (SELECT t.* FROM $joinsqlcollection t {$condition} ) tb_A WHERE ROWNUM <= {$finish} ) tb_B WHERE tb_B.rn>{$start} "; $countsql = "SELECT COUNT(*) AS totalrows, SUM(t.new_user) AS totalnewusr,SUM(t.one_user) AS totaloneusr,SUM(t.three_user) AS totalthreeusr,SUM(t.seven_user) AS totalsevenusr FROM $joinsqlcollection t {$condition} "; $db = oralceinit(1); $stidquery = $db->query($sql,false); $output = array(); while($row = $db->FetchArray($stidquery, $skip = 0, $maxrows = -1)) { $output['data'][] = array_change_key_case($row,CASE_LOWER); } $count_stidquery = $db->query($countsql,false); $row = $db->FetchArray($count_stidquery, $skip = 0, $maxrows = -1); $output['total']= array_change_key_case($row,CASE_LOWER); //echo "<br />".($sql)."<br />"; return $output; } }

相關推薦

Oracle資料庫order by排序null處理方法

最近在忙活公司產品後臺的資料報表,在對業務資料排序時候,發現有些欄位的記錄是null值,這時排序便出現了有違我們使用習慣的資料大小順序問題。在Oracle中規定,在Order by排序時預設認為null是最大值,所以如果是ASC升序則被排在最後,而DESC降序則排在最前。

oracle order by 排序降序 null 排最後

1 表資料person_info id   name  age 1    qq       23 2    ee  &

oracleorder by排序中空字串處理方法

oracle的order by排序中空字串處理方法   2009-09-18 14:02:56|  分類: 資料庫、sql |  標籤: |字號大中小 訂閱 1、預設處理   Oracle在Or

ORDER BY 排序時 欄位有NULL NULL排在後面

一般情況下人們會想到使用非空值代替NULL這時使用coalesce()函式 把控制設定為0但是當欄位為日期時,這用使用這種寫法,即以此日期升序排列,然後把NULl值放在後面ORDER BY  lend.contract_submit_bank_date IS NULL ASC

玩得一手好註入order by排序

布爾 idt center 取反 操作符 aaa 發生 9.png 很多 看了之前Gr36_前輩在先知上的議題,其中有提到排序註入,這個在最近經常遇到這樣的問題,所以先總結下order by 排序註入的知識。 0×0

解決Oracle分頁使用order by排序造成分頁順序不對的問題

今天在做專案的時候,在使用JPA對訂單進行按時間排序的時候發現查分頁資料的時候有點問題。我先一頁設定一條資料,然後發現第一頁和第二頁的資料居然一樣。下面給出我BaseDao中的JPA分頁方法: @Override public List<T> f

oracle-union order by rownum排序與取數

order by在union的排序可以寫在後一個select裡 SELECT 5 Id,2 Name From dual UNION ALL Select 3,4 From dual Order

oracle】中文的order by排序規則

總結: 單純使用order by排序中文,是根據ascii碼排序的,不是根據拼音排序的。 如果要根據拼音排序某一列,需要用函式nlssort(列名,’NLS_SORT=SCHINESE_PINYIN

資料庫 order by varchar型別排序

首先說明下oracle中沒有String型別,而是Varchar型別。order by 的順序是assic(讀作:阿斯科馬)碼錶中”字元“列進行排序的。 解釋:一般會根據字串的首字母:大些字母>小寫字母>特殊字元>數字。如果首位相同繼續排列第二位,直到

mysql資料庫order by語句 null 處理

在使用order by語句進行查詢結果排序時,不同的資料庫對於被排序欄位資料行為null的情況,處理方式有所不同,這裡我們主要考慮oracle和MySQL資料庫。 首先我們直接給出結論: leeyee 寫道 【Oracle 結論】  order by colum asc 時,null預設被放在最後

Oracle中使用Order By排序時結果順序不穩定的解決辦法

Oracle的分頁查詢是沒有進行任何排序操作的,Oracle是順序的從資料塊中讀取符合條件的資料返回到客戶端。 而Oracle的排序演算法不具有穩定性,也就是說,對於排序鍵值相等的資料,這種演算法完成

oracle order by 排序

tinc average asc oracle sele 使用 acl ora -name Syntax ORDER BY { column-Name | ColumnPosition | Expression } [ ASC | DESC ] [ NULL

MySQ學習筆記NULL處理

con pop -a 能夠 第一個 ips ng- 索引 one 這是MySQL一大特殊之處。 概念上。NULL意味著“沒有值”或“未知值”,且它被看作有點與眾不同的值。為了測試NULL。你不能使用算術比較

MySQL如何利用索引優化ORDER BY排序語句

login 查詢 art mysq 實例 .html 情況 降序排序 建立索引 官網排序優化:http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html MySql創建索引時支持ASC或DESC排序。

PostgreSQL order by 排序問題

from IT 導致 問題 http sql 需要 想要 HR 默認的排序為order by 字段名, 如果該字段不允許為空的情況下可以這樣操作, 但是當字段允許為null時,order by 字段名的方式會導致: 升序時(asc): 會從最小值開始升序,最後面接上字段值為

【MySql】Order By 排序

des 需要 .com utf 字符集 條件 itl sele com 你可以使用任何字段來作為排序的條件,從而返回排序後的查詢結果。 你可以設定多個字段來排序。 你可以使用 ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列。 默認情況下,它是按升序排列。 你

MySQL利用索引優化ORDER BY排序語句

MySQL利用索引優化ORDER BY排序語句 MySQL索引通常是被用於提高WHERE條件的資料行匹配或者執行聯結操作時匹配其它表的資料行的搜尋速度。 MySQL也能利用索引來快速地執行ORDER BY和GROUP BY語句的排序和分組操作。 通過索引優化來實

oracle查詢不等於條件包含null

需求:現在oracle資料庫中有欄位is_use 的值有:null,0,1,2。現在需要查詢不等於2的資料 解決辦法的sql: select * from uc_Users where nvl(is_use,'xx')<>'2' ====================

MySQL UNION、排序、分組、連線、NULL處理和正則表示式

UNION SQL UNION 下面的SQL語句從product和orderdetail表中選取所有不同的pCode(只有不同值) SELECT pCode FROM product UNION SELECT pCode FROM orderdetail ORDER BY p

SQLNULL的幾種處理方式

1、建立測試表: drop table if exists tab_null_operator; create table tab_null_operator as select 1 as id,'chavin' as name union all select 2 as id,'nope' as n