1. 程式人生 > >Oracle-查詢-單行函式

Oracle-查詢-單行函式

字元函式

LOWER(str):傳入的字串轉換為小寫

UPPER(str):傳入的字串轉換為大寫

CANCAT(str1,str2):連線兩個字串

LENGTH(str):計算字串長度

SUBSTR(str,index,end):擷取字串,返回index到end的子串——下標從1開始包括後面的字元

SELECT SUBSTR('Oracle',1,4) FROM dual;
-- 結果:Orac

LPAD(str,len,char):查詢出來的字串為len位,超過則從第一位開始擷取位,不足則在左邊補char

SELECT LPAD(last_name,1,'*') FROM employees;
-- 結果位:K
SELECT LPAD(last_name,10,'*') FROM employees;
-- 結果為:******King

RPAD(str,len,char):查詢出來的字串為len位,超過則從第一位開始擷取位,不足則在右邊補char

TRIM(char from str):去除字串str中前後的char字元

SELECT TRIM('H' FROM 'HHelloHHHWorldHH') FROM dual;
-- 結果為:elloHHHWorld

REPLACE(str,char1,char2):將字串str中的char1替換為char2

SELECT replace('HHelloHHHWorldHH','H','A') FROM dual;
-- 結果為:AAelloAAAWorldAA

數字函式

ROUND:保留幾位數(約等於)

SELECT round(234.56,2),round(234.56),round(234.56,-2) FROM dual;
-- 結果為:234.56    235    200

TRUNC:截斷

SELECT TRUNC(234.56,2),TRUNC(234.56),TRUNC(234.56,-2) FROM dual;
-- 結果為:234.56    234    200

MOD:求餘

SELECT MOD(7,2) FROM dual;
-- 結果為:1

日期函式

MONTHS_BETWEEN(date1,date2):兩個日期相差的幾個月

SELECT last_name, Months_between(SYSDATE,HIRE_DATE) FROM employees;

ADD_MONTHS(date,n):指定日期上加幾個月

NEXT_DAY(date,week):下一個星期幾的日期

SELECT NEXT_DAY(SYSDATE,'星期六') FROM dual;

LAST_DAY(date):日期的當月的最後一天

SELECT LAST_DAY(SYSDATE) FROM dual;
-- 結果為:2018/12/31 23:29:58

求員工入職日期為當月的倒數第二天的人

SELECT last_name,hire_date  FROM employees WHERE hire_date = last_day(hire_date) - 2;
-- 結果:
-- 1	Chen	        1997/9/28
-- 2	Mikkilineni     1998/9/28
-- 3	Davies	        1997/1/29
-- 4	Zlotkey	        2000/1/29

ROUND:約等於

TRUNC:截斷

SELECT ROUND(SYSDATE,'month'),ROUND(SYSDATE,'mm'),trunc(SYSDATE),TRUNC(SYSDATE,'hh') FROM dual;
-- 結果:2019/1/1	2019/1/1	2018/12/21	2018/12/21 20:00:00

轉換函式

TO_CHAR():轉換為字串

SELECT to_char(12345678.123,'99,999,999.999') FROM dual;
-- 結果為: 12,345,678.123
SELECT to_char(1234567.89,'$9,999,999.99') FROM dual;
-- 結果為: $1,234,567.89
SELECT * FROM employees e WHERE to_char(e.hire_date,'yyyy/mm/dd') = '1987/06/17'
-- 結果為:1	100	Steven	King	SKING	515.123.4567	1987/6/17	AD_PRES	24000.00			90

TO_DATE():將字串轉換為日期

TO_NUMBER():將字串轉換為數字

SELECT to_number('$1,234,567.89','$9,999,999.99') FROM dual;
-- 結果為:1234567.89

通用函式

NVL(var,default):當var為空時,值為default,否則值為var

SELECT 12*e.salary*(1 + NVL(e.commission_pct,0)) FROM employees e ;
-- 函式中前後值型別需要匹配
SELECT NVL(to_char(department_id),'沒有部門') FROM employees;

NVL2(var1,var2,var3):當var1不為null返回var2,若var1為null則返回var3 

SELECT NVL2(e.department_id,1,0) FROM employees e;

NULLIF(exp1,exp2):兩個值相等返回null,不等返回exp1

IF-THEN-ELSE:

SELECT CONCAT(e.last_name, e.last_name),e.department_id,
        CASE e.department_id 
        WHEN 10 THEN e.salary*(1 + 0.1)    
        WHEN 20 THEN e.salary*(1 + 0.2)    
        WHEN 30 THEN e.salary*(1 + 0.3)
        ELSE e.salary																											            
        END new_salary
FROM employees e

DECODE:

SELECT e.first_name || '_' || e.last_name,e.department_id, 
        DECODE(e.department_id,10,e.salary*1.1,
                               20,e.salary*1.2,
                               e.salary)
FROM employees e;

 

習題

-- 打印出 "2009年10月14日 9:25:40" 格式的當前系統的日期和時間.
SELECT to_char(SYSDATE,'yyyy"年"mm"月"dd"日" hh:mi:ss ') FROM dual;
-- 格式化數字: 1234567.89 為 1,234,567.89
SELECT to_char(1234567.89,'9,999,999.99') FROM dual;
-- 字串轉為數字時
-- 1). 若字串中沒有特殊字元, 可以進行隱式
SELECT '123.45'+ 100 FROM dual;
-- 結果:223.45
-- 2). 若字串中有特殊字元, 例如 '1,234,567.89', 則無法進行隱式轉換, 需要使用 to_number() 來完成
SELECT to_number('¥1,234,567.89','L9,999,999.99') FROM dual;
-- 結果:1234567.89
-- 對於把日期作為查詢條件的查詢, 一般都使用 to_date() 把一個字串轉為日期, 這樣可以不必關注日期格式
SELECT e.last_name,e.hire_date
FROM employees e
--WHERE to_char(e.hire_date,'yyyy/mm/dd') = '1987/06/17';
WHERE to_date('1987/06/17','yyyy/mm/dd') = e.hire_date;
-- 查詢每個月倒數第 2 天入職的員工的資訊. 
SELECT e.last_name,e.hire_date
FROM employees e
WHERE last_day(e.hire_date) -2 = e.hire_date;
-- 計算公司員工的年薪
SELECT e.last_name,e.salary*(1 + NVL(e.commission_pct,0))*12 year_sal
FROM employees e
-- 1.	顯示系統時間(注:日期+時間)
SELECT to_char(SYSDATE,'yyyy/mm/dd hh:mi:ss') FROM dual;
SELECT SYSDATE FROM dual;

-- 2.	查詢員工號,姓名,工資,以及工資提高百分之20%後的結果(new salary)
SELECT e.employee_id,e.last_name,e.salary,e.salary*(1 + 0.2)
FROM employees e

-- 3.	將員工的姓名按首字母排序,並寫出姓名的長度(length)
SELECT e.last_name,Length(e.last_name)
FROM employees e
ORDER BY e.last_name

-- 4.	查詢各員工的姓名,並顯示出各員工在公司工作的月份數(worked_month)。
SELECT  e.last_name,TRUNC(months_between(SYSDATE,e.hire_date))
FROM employees e

-- 5.	查詢員工的姓名,以及在公司工作的月份數(worked_month),並按月份數降序排列
SELECT  e.last_name,TRUNC(months_between(SYSDATE,e.hire_date)) worked_month
FROM employees e
ORDER BY worked_month DESC

SELECT * FROM employees;

-- 6.	使用decode函式,按照下面的條件:
SELECT e.last_name,
         DECODE(
                e.job_id,'AD_PRES','A',
                         'ST_MAN',
                         'B','IT_PROG',
                         'C','SA_REP',
                         'D','ST_CLERK',
                         'D','Z'
         ) job_id
FROM employees e

-- 7.	將第6題的查詢用case函式再寫一遍。
SELECT e.last_name,
         CASE  e.job_id WHEN 'AD_PRES' THEN 'A'
                        WHEN 'ST_MAN' THEN 'B'
                        WHEN 'IT_PROG' THEN 'C'
                        WHEN 'SA_REP'THEN 'D'
                        WHEN  'ST_CLERK' THEN 'D'
                        ELSE 'Z'END job_id
FROM employees e