1. 程式人生 > 實用技巧 >oracle—decode、nvl、rownum、like、all、any使用

oracle—decode、nvl、rownum、like、all、any使用

一、decode()——多值判斷

語法:decode(表示式,比較值1,結果值1,比較值1,結果值1,...,預設值)

SQL> select employee_name,decode(sign(instr(employee_position,'工程師')),1,'技術部','行政部') partment from employees;
 
EMPLOYEE_NAME PARTMENT
------------- --------
江小白        行政部
              行政部
大鱷          技術部
昂嗚          技術部
李四          技術部
張三          行政部
過戶          技術部
問題          技術部
語句          技術部
陳武          技術部
六六          技術部
 
11 rows selected
View Code

二、nvl()——空值判斷

語法:nvl(表示式,新值/表示式)

SQL> select employee_name,employee_position,nvl(employee_position,'行政部') new from employees;
 
EMPLOYEE_NAME EMPLOYEE_POSITION NEW
------------- ----------------- ----------
江小白                          行政部
大鱷          工程師            工程師
昂嗚          高階工程師        高階工程師
李四          高階工程師        高階工程師
張三          開發經理          開發經理
過戶          工程師            工程師
問題          工程師            工程師
語句          測試工程師        測試工程師
陳武          測試工程師        測試工程師
六六          測試工程師        測試工程師
 
10 rows selected
View Code

三、rownum()——結果集行號

1.增加rownum一列

SQL> select employee_id,employee_name,rownum new from employees;
 
EMPLOYEE_ID EMPLOYEE_NAME        NEW
----------- ------------- ----------
10          江小白                 1
4           大鱷                   2
3           昂嗚                   3
2 李四 4 1 張三 5 5 過戶 6 6 問題 7 7 語句 8 8 陳武 9 9 六六 10 10 rows selected
View Code

2.rownum與orderby

需求:按照id排序並取出前3位。

SQL> select employee_id,employee_name,rownum new from employees where rownum <=3 order by employee_id;
 
EMPLOYEE_ID EMPLOYEE_NAME        NEW
----------- ------------- ----------
10          江小白                 1
3           昂嗚                   3
4           大鱷                   2
 
SQL> select employee_id,employee_name,rownum new from(select *  from employees  order by employee_id) where rownum<=3 ;
 
EMPLOYEE_ID EMPLOYEE_NAME        NEW
----------- ------------- ----------
1           張三                   1
10          江小白                 2
2           李四                   3

SQL> select employee_id,employee_name,rownum new from(select *  from employees  order by cast(employee_id as number)) where rownum<=3 ;
 
EMPLOYEE_ID EMPLOYEE_NAME        NEW
----------- ------------- ----------
1           張三                   1
2           李四                   2
3           昂嗚                   3
View Code

備註:where的過濾條件優先於orderby條件;id的型別為varchar,所以排序是10排在2前面,利用cast將字元轉換為數值型後,排序正常。

3.rownum與“=”

能獲取到rownum=1的資料,獲取不到rownum=4的資料。

SQL> select * from employees where rownum=1;
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
10          江小白                                                            
 
SQL> select * from employees where rownum=4;
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
View Code

4.rownum與“>”

rownum>1時沒有資料,rownum>0時查詢全部資料。

SQL> select * from employees where rownum>1;
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
 
SQL> select * from employees where rownum>0;
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
10          江小白                                                            
4           大鱷          工程師                      26 巴南                 1988-07-01
3           昂嗚          高階工程師                  27 渝北                 1998-06-01
2           李四          高階工程師                  32 渝北                 1994-09-01
1           張三          開發經理                    37 巴南                 1987-11-01
5           過戶          工程師                      26 渝中                 1985-08-01
6           問題          工程師                      25 渝中                 1980-02-09
7           語句          測試工程師                  24 九龍坡               2010-05-03
8           陳武          測試工程師                  25 江北                 2004-01-23
9           六六          測試工程師                  32 南岸                 1994-12-21
 
10 rows selected
View Code

四、like——模糊匹配

1."%"——匹配

需求:查詢以“工程師”結尾的資料

SQL> select * from employees where employee_position like '%工程師';
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
4           大鱷          工程師                      26 巴南                 1988-07-01
3           昂嗚          高階工程師                  27 渝北                 1998-06-01
2           李四          高階工程師                  32 渝北                 1994-09-01
5           過戶          工程師                      26 渝中                 1985-08-01
6           問題          工程師                      25 渝中                 1980-02-09
7           語句          測試工程師                  24 九龍坡               2010-05-03
8           陳武          測試工程師                  25 江北                 2004-01-23
9           六六          測試工程師                  32 南岸                 1994-12-21
 
8 rows selected
View Code

2."_"——匹配一個字元

需求:查詢以“XX工程師”的資料

SQL> select * from employees where employee_position like '__工程師';
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
3           昂嗚          高階工程師                  27 渝北                 1998-06-01
2           李四          高階工程師                  32 渝北                 1994-09-01
7           語句          測試工程師                  24 九龍坡               2010-05-03
8           陳武          測試工程師                  25 江北                 2004-01-23
9           六六          測試工程師                  32 南岸                 1994-12-21
View Code

3.元義字元

需求:判斷以%號結尾

SQL> select 1 result from dual where '10%' like '%%';
 
    RESULT
----------
         1
 
SQL> select 1 result from dual where '10' like '%%';
 
    RESULT
----------
         1
 
SQL> select 1 result from dual where '10' like '%\%' escape '\';
 
    RESULT
----------
 
SQL> select 1 result from dual where '10%' like '%\%' escape '\';
 
    RESULT
----------
         1
View Code

五、all、some、any——集合判斷

需求:查詢大於所有工程師年齡的員工資訊。

SQL> select * from employees where employee_age>all(select employee_age from employees where employee_position='工程師');
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
3           昂嗚          高階工程師                  27 渝北                 1998-06-01
2           李四          高階工程師                  32 渝北                 1994-09-01
9           六六          測試工程師                  32 南岸                 1994-12-21
1           張三          開發經理                    37 巴南                 1987-11-01
 
SQL> select * from employees where employee_age> (select max(employee_age) from employees where employee_position='工程師');
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
3           昂嗚          高階工程師                  27 渝北                 1998-06-01
2           李四          高階工程師                  32 渝北                 1994-09-01
1           張三          開發經理                    37 巴南                 1987-11-01
9           六六          測試工程師                  32 南岸                 1994-12-21
 
View Code

需求:查詢大於任意一位工程師年齡的員工資訊。

SQL> select * from employees where employee_age>any(select employee_age from employees where employee_position='工程師');
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
1           張三          開發經理                    37 巴南                 1987-11-01
2           李四          高階工程師                  32 渝北                 1994-09-01
9           六六          測試工程師                  32 南岸                 1994-12-21
3           昂嗚          高階工程師                  27 渝北                 1998-06-01
5           過戶          工程師                      26 渝中                 1985-08-01
4           大鱷          工程師                      26 巴南                 1988-07-01
 
6 rows selected
 
SQL> select * from employees where employee_age> (select min(employee_age) from employees where employee_position='工程師');
 
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_POSITION EMPLOYEE_AGE EMPLOYEE_ADD         EMPLOYEE_BIRTH
----------- ------------- ----------------- ------------ -------------------- --------------
4           大鱷          工程師                      26 巴南                 1988-07-01
3           昂嗚          高階工程師                  27 渝北                 1998-06-01
2           李四          高階工程師                  32 渝北                 1994-09-01
1           張三          開發經理                    37 巴南                 1987-11-01
5           過戶          工程師                      26 渝中                 1985-08-01
9           六六          測試工程師                  32 南岸                 1994-12-21
 
6 rows selected
View Code

整理於《oracle入門很簡單》一書