本篇文章給大家帶來了關于oracle的相關知識,其中主要介紹了關于order by多種排序的相關問題,包括了按單個字段排序、按多個字段排序、按子串排序等等,希望對大家有幫助。
推薦教程:《oracle》
1. 按單個字段排序
升序:ORDER BY ASC(默認)
降序:ORDER BY DESC
以指定的次序返回查詢結果實際提取數據或生成報表時,一般都要根據一定的順序查看,比如,想查看單位所雇員工的信息。
SELECT empno, ename, hiredate FROM emp WHERE deptno = 10 ORDER BY hiredate ASC;
給查詢結果排序這種語句很多人都會寫,但除了“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;
下面用圖的形式進行介紹,如下圖所示,多列排序時,若前面的列有重復值(如deptno = 10有3行數據),后面的排序才有用。相當于是通過前面的列把數據分成了幾組,然后每組的數據再按后面的列進行排序。
?3. 按子串排序
按子串排序有一種速査法就是按顧客電話號碼尾號的順序記錄,這樣在查找的時候就可以快速縮小査詢范圍,增強顧客的認可度。如果要按這種方法排序,應該怎么做呢?通過函數取出后面幾位所需的信息即可。
SELECT last_name AS 名稱, phone_number AS 號碼, salary as 工資, substr(phone_number, -4) AS 尾號 FROM hr.employees WHERE rownum < 5 ORDER BY 4;
?由此可見:只要能將數據査詢出來,就能根據相應的信息排序。
4.?TRANSLATE
語法格式:TRANSLATE(expr, from_string, to_string)
示例如下:
SELECT TRANSLATE( 'ab 你好 bcadefg', 'abcdefg', '1234567' ) AS NEW_STR FROM DUAL;
from_string與to_string以字符為單位,對應字符一一替換。
如果 to_string為空,則返回空值?
SELECT TRANSLATE( 'ab 你好 bcadefg', 'abcdefg', '' ) AS NEW_STR FROM DUAL;
如果 to_string對應的位置沒有字符,刪除 from_string中列出的字符將會被消掉。?
SELECT TRANSLATE( 'ab 你好 bcadefg', '1abcdefg', '1' ) AS NEW_STR FROM DUAL;
?
5.?按數字和字母混合字符串中的字母排序
首先創建VIEW如下:
CREATE OR REPLACE VIEW V as SELECT empno || ' ' || ename AS data FROM emp;
select * from V;
?這個需求就難一點了,看到里面的字母(也就是原來的列 ename)嗎?要求按其中的字母(列 ename)排序。
那么就要先取出其中的字母才行,我們可以用 translate的替換功能,把數字與空格都替換為空:
SELECt data, translate (data, '- 0123456789', '-' )AS ename FROM v ORDER BY 2;
6. 處理排序空值
oracle默認排序空值在后面,如果想把空值(如emp.comm)顯示在前面怎么辦,用NVL(comm,-1)嗎?
SELECT ename, sal, comm, nvl(comm, - 1) order_col FROM emp ORDER BY 4;
?
也許很多人都是用的這種方法,但這種方法需要對列類型及其中保存的數據有所了解才行,而且保存的數據如果有變化,該語句就要重新維護。
其實可以用關鍵字 NULLS FIRST和 NULLS LAST。
空值在前
SELECT ename, sal, comm FROM emp ORDER BY 3 NULLS FIRST;
?空值在后
SELECT ename, sal, comm FROM emp ORDER BY 3 NULLS LAST;
?是不是要方便得多?
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;
?
?
可以看到,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》