一起聊聊ORACLE中ORDER BY的多種排序

本篇文章給大家帶來了關于oracle的相關知識,其中主要介紹了關于order by多種排序的相關問題,包括了按單個字段排序、按多個字段排序、按子串排序等等,希望對大家有幫助。

一起聊聊ORACLE中ORDER BY的多種排序

推薦教程:《oracle

1. 按單個字段排序

升序:ORDER BY ASC(默認)

降序:ORDER BY DESC

以指定的次序返回查詢結果實際提取數據或生成報表時,一般都要根據一定的順序查看,比如,想查看單位所雇員工的信息。

SELECT empno, ename, hiredate FROM emp WHERE deptno = 10 ORDER BY hiredate ASC;

一起聊聊ORACLE中ORDER BY的多種排序

給查詢結果排序這種語句很多人都會寫,但除了“ORDER BY hiredate ASC”這種寫法外,還可以寫成“ ORDER BY 3 ASC”,意思是按第三列排序。

SELECT empno, ename, hiredate FROM emp WHERE deptno = 10 ORDER BY 3 ASC;

當取值不定時,用這種方法就很方便,需要注意的是,

用數據來代替列位置只能用于 order by子句中,其他地方都不能用

2. 按多個字段排序

如果按多列排序且有升有降怎么辦?如:按部門編號升序,并按工資降序排列排序時有兩個關鍵字:ASC表示升序、DESC表示降序所以我們在 order by后加兩列,并分別標明ASC、DESC。

SELECT empno, deptno, sal, ename, job FROM emp ORDER BY 2 ASC, 3 DESC;

一起聊聊ORACLE中ORDER BY的多種排序

下面用圖的形式進行介紹,如下圖所示,多列排序時,若前面的列有重復值(如deptno = 10有3行數據),后面的排序才有用。相當于是通過前面的列把數據分成了幾組,然后每組的數據再按后面的列進行排序。

一起聊聊ORACLE中ORDER BY的多種排序

?3. 按子串排序

按子串排序有一種速査法就是按顧客電話號碼尾號的順序記錄,這樣在查找的時候就可以快速縮小査詢范圍,增強顧客的認可度。如果要按這種方法排序,應該怎么做呢?通過函數取出后面幾位所需的信息即可。

SELECT last_name AS 名稱,        phone_number AS 號碼,        salary as 工資,        substr(phone_number, -4) AS 尾號   FROM hr.employees  WHERE rownum < 5  ORDER BY 4;

一起聊聊ORACLE中ORDER BY的多種排序

?由此可見:只要能將數據査詢出來,就能根據相應的信息排序。

4.?TRANSLATE

語法格式:TRANSLATE(expr, from_string, to_string)

示例如下:

SELECT TRANSLATE( 'ab 你好 bcadefg', 'abcdefg', '1234567' ) AS NEW_STR FROM DUAL;

一起聊聊ORACLE中ORDER BY的多種排序

from_string與to_string以字符為單位,對應字符一一替換。

一起聊聊ORACLE中ORDER BY的多種排序

如果 to_string為空,則返回空值?

SELECT TRANSLATE( 'ab 你好 bcadefg', 'abcdefg', '' ) AS NEW_STR FROM DUAL;

一起聊聊ORACLE中ORDER BY的多種排序

如果 to_string對應的位置沒有字符,刪除 from_string中列出的字符將會被消掉。?

SELECT TRANSLATE( 'ab 你好 bcadefg', '1abcdefg', '1' ) AS NEW_STR FROM DUAL;

一起聊聊ORACLE中ORDER BY的多種排序

一起聊聊ORACLE中ORDER BY的多種排序

?

5.?按數字和字母混合字符串中的字母排序

首先創建VIEW如下:

CREATE OR REPLACE VIEW V  as  SELECT empno || ' ' || ename AS data FROM emp;
select * from V;

一起聊聊ORACLE中ORDER BY的多種排序

?這個需求就難一點了,看到里面的字母(也就是原來的列 ename)嗎?要求按其中的字母(列 ename)排序。

那么就要先取出其中的字母才行,我們可以用 translate的替換功能,把數字與空格都替換為空:

SELECt data, translate (data, '- 0123456789', '-' )AS ename   FROM v  ORDER BY 2;

一起聊聊ORACLE中ORDER BY的多種排序

6. 處理排序空值

oracle默認排序空值在后面,如果想把空值(如emp.comm)顯示在前面怎么辦,用NVL(comm,-1)嗎?

SELECT ename, sal, comm, nvl(comm, - 1) order_col FROM emp ORDER BY 4;

一起聊聊ORACLE中ORDER BY的多種排序

?

也許很多人都是用的這種方法,但這種方法需要對列類型及其中保存的數據有所了解才行,而且保存的數據如果有變化,該語句就要重新維護。
其實可以用關鍵字 NULLS FIRST和 NULLS LAST。

空值在前

SELECT ename, sal, comm FROM emp ORDER BY 3 NULLS FIRST;

一起聊聊ORACLE中ORDER BY的多種排序

?空值在后

SELECT ename, sal, comm FROM emp ORDER BY 3 NULLS LAST;

一起聊聊ORACLE中ORDER BY的多種排序

?是不是要方便得多?

7.?根據條件取不同列中的值來排序

有時排序的要求會比較復雜,比如:領導對工資在1000到2000元之間的員工更感興趣,于是要求工資在這個范圍的員工要排在前面,以便優先査看。
對于這種需求,我們可以在查詢中新生成一列,用多列排序的方法處理:

SELECT empno AS 編碼,        ename AS 姓名,        CASE          WHEN sal > 1000 AND sal < 2000 THEN           1          ELSE           2        END AS 級別,        sal AS工資   FROM emp  WHERE deptno = 30  ORDER BY 3, 4;

一起聊聊ORACLE中ORDER BY的多種排序?

?

一起聊聊ORACLE中ORDER BY的多種排序

可以看到,950與2850都排在了后面,也可以不顯示級別,直接把 case when放在order by中

SELECT empno AS 編碼, ename AS 姓名, sal AS工資   FROM emp  WHERE deptno = 30  ORDER BY CASE             WHEN sal >= 1000 AND sal < 2000 THEN              1             ElSE              2           END,           3;

?一起聊聊ORACLE中ORDER BY的多種排序一起聊聊ORACLE中ORDER BY的多種排序

推薦教程:《oracle

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享