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;