Oracle-查詢-單行函式
阿新 • • 發佈:2018-12-23
字元函式
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