1. 程式人生 > >Oracle 之 單行函式

Oracle 之 單行函式

單行函式

操作資料物件

接受引數返回一個結果

只對一行進行變換

每行返回一個結果

可以轉換資料型別

可以巢狀

引數可以是一列或一個值

1.字元控制函式

這類函式改變字元的大小寫

函式 結果

LOWER('SQL Course')

sql course

UPPER('SQL Course')

SQL COURSE

INITCAP('SQL Course')

Sql Course

SELECT employee_id, last_name, department_id
FROM   employees
WHERE  LOWER(last_name) = 'higgins';

2.字元控制函式

這類函式控制字元:

函式

結果

CONCAT('Hello', 'World')

HelloWorld

SUBSTR('HelloWorld',1,5)

Hello

LENGTH('HelloWorld')

10

INSTR('HelloWorld', 'W')

6

LPAD(salary,10,'*')

*****24000

RPAD(salary, 10, '*')

24000*****

TRIM('H' FROM 'HelloWorld')

elloWorld

REPLACE(‘abcd’,’b’,’m’)

amcd

例如:

SELECT employee_id, CONCAT(first_name, last_name) NAME, 
       job_id, LENGTH (last_name), 
       INSTR(last_name, 'a') "Contains 'a'?"
FROM   employees
WHERE  SUBSTR(job_id, 4) = 'REP';

3.數字函式

ROUND: 四捨五入

ROUND(45.926, 2)   ---->   45.93

TRUNC:  截斷

TRUNC(45.926, 2)  ---->    45.92

MOD: 求餘

MOD(1600, 300)   --->   100

SELECT ROUND(45.923,2), ROUND(45.923,0),
       ROUND(45.923,-1)
FROM   DUAL;

DUAL 是一個‘偽表’,可以用來測試函式和表示式

SELECT  TRUNC(45.923,2), TRUNC(45.923),
        TRUNC(45.923,-2)
FROM   DUAL;
SELECT last_name, salary, MOD(salary, 5000)
FROM   employees
WHERE  job_id = 'SA_REP';

4.日期

Oracle 中的日期型資料實際含有兩個值: 日期和時間。

函式SYSDATE 返回: 日期  時間

在日期上加上或減去一個數字結果仍為日期。

兩個日期相減返回日期之間相差的天數

日期不允許做加法運算,無意義

可以用數字除24來向日期中加上或減去天數。

SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS
FROM   employees
WHERE  department_id = 90;

函式

描述

MONTHS_BETWEEN

兩個日期相差的月數

ADD_MONTHS

向指定日期中加上若干月數

NEXT_DAY

指定日期的下一個星期 * 對應的日期

LAST_DAY

本月的最後一天

ROUND 日期四捨五入
TRUNC

日期截斷

5.轉換函式

5.1 TO_CHAR函式對日期的轉換

必須包含在單引號中而且大小寫敏感

可以包含任意的有效的日期格式

日期之間用逗號隔開

SELECT TO_CHAR(sysdate,‘yyyy-mm-dd hh:mi:ss’) FROM dual;
SELECT last_name,
       TO_CHAR(hire_date, 'DD Month YYYY')
       AS HIREDATE
FROM   employees;
select employee_id,last_name,hire_date
from employees
where to_char(hire_date,’yyyy-mm-dd’) = ‘1987-09-17’

5.2 TO_CHAR函式對數字的轉換

SELECT TO_CHAR(salary, '$99,999.00') SALARY
FROM   employees
WHERE  last_name = 'Ernst';

5.3 TO_DATE 函式對字元的轉換

使用 TO_DATE 函式將字元轉換成數字

TO_DATE('2012年10月29日 08:10:21','yyyy"年"mm"月"dd"日"hh:mi:ss')
From dual

5.4 TO_NUMBER函式對字元的轉換

TO_NUMBER(‘¥1,234,567,890.00’,’L999,999,999,999.99’)
from dual

6.通用函式

這些函式適用於任何資料型別,同時也適用於空值

NVL (expr1, expr2)

NVL2 (expr1, expr2, expr3)

NULLIF (expr1, expr2)

COALESCE (expr1, expr2, ..., exprn)

6.1 NVL

將空值轉換成一個已知的值:(也就是給了一個預設值)

可以使用的資料型別有日期、字元、數字。

函式的一般形式:

NVL(commission_pct,0)

NVL(hire_date,'01-JAN-97')

NVL(job_id,'No Job Yet')

6.2 NVL2

NVL2 (expr1, expr2, expr3) : expr1不為NULL,返回expr2;為NULL,返回expr3

SELECT last_name,  salary, commission_pct,
       NVL2(commission_pct, 
            'SAL+COMM', 'SAL') income
FROM   employees WHERE department_id IN (50, 80);

6.3 NULLIF

NULLIF (expr1, expr2) :  相等返回NULL,不等返回expr1

SELECT first_name, LENGTH(first_name) "expr1", 
       last_name,  LENGTH(last_name)  "expr2",
       NULLIF(LENGTH(first_name), LENGTH(last_name)) result
FROM   employees;

 6.4 COALESCE

COALESCE NVL 相比的優點在於 COALESCE 可以同時處理交替的多個值。

如果第一個表示式為空,則返回下一個表示式,對其他的引數進行COALESCE

SELECT   last_name,
         COALESCE(commission_pct, salary, 10) comm
FROM     employees
ORDER BY commission_pct;

7.條件表示式

7.1 CASE 表示式

例如:查詢部門號為 10, 20, 30 的員工資訊, 若部門號為 10, 則列印其工資的 1.1 , 20 號部門, 則列印其工資的 1.2 , 30 號部門列印其工資的 1.3 倍數

SELECT last_name, job_id, salary,
       CASE job_id WHEN 'IT_PROG'  THEN  1.10*salary
                   WHEN 'ST_CLERK' THEN  1.15*salary
                   WHEN 'SA_REP'   THEN  1.20*salary
       ELSE      salary END     "REVISED_SALARY"
FROM   employees;

7.2 DECODE 函式

SELECT last_name, job_id, salary,
       DECODE(job_id, 'IT_PROG',  1.10*salary,
                      'ST_CLERK', 1.15*salary,
                      'SA_REP',   1.20*salary,
              			    salary)
       REVISED_SALARY
FROM   employees;

8.巢狀函式

單行函式可以巢狀。

巢狀函式的執行順序是由內到外。

SELECT last_name,
       NVL(TO_CHAR(manager_id), 'No Manager')
FROM   employees
WHERE  manager_id IS NULL;