1單行函數的一些特點
單行函數還有以下的一些特徵:
–單行函數對單行操作
–每行返回一個結果
–有可能返回值與原參數數據類型不一致(轉換函數)
–單行函數可以寫在SELECT、WHERE、ORDER BY子句中
–有些函數沒有參數,有些函數包括一個或多個參數
–函數可以嵌套
2單行函數的分類
字符函數
數字函數
日期函數
轉換函數
通用函數
3 字符函數
大小寫操作函數
LOWER(列名|表達式)其它同理
LOWER,UPPER,INITCAP(將首字母大寫,其它字母小寫)
字符處理函數
CONCAT:連接兩個值,等同於||
CONCAT('Good','String‘) 結果 GoodString
SUBSTR:返回第一個參數中從n1字符開始長度爲n2的子串,如果n1是負值,表從後向前數的abs(n1)位,如果n2省略,取n1之後的所有字符 格式:SUBSTR(column | expression,n1[,n2])
SUBSTR('String',1,3) 結果Str
LENGTH :取字符串的長度 LENGTH('String') 結果 6
INSTR:返回s1中,子串s2從n1開始,第n2次出現的位置。n1,n2默認值爲1 格式:INSTR(s1,s2,[,n1],[n2])
INSTR('String','r') 結果 3
LPAD:返回s1被s2從左面填充到n1長度。 格式:LPAD(s1,n1,s2)
LPAD(sal,10,'*') 結果 ******5000
RPAD:返回s1被s2從右面填充到n1長度。 格式:RPAD(s1,n1,s2)
RPAD(sal,10,'*') 結果5000******
TRIM:去除字符串頭部或尾部(頭尾)的字符 格式:TRIM(leading | trailing | both trim_character From trim_source)
TRIM('S' FROM 'SSMITH') 結果MITH
REPLACE:把s1中的s2用s3替換。 格式:REPLACE(s1,s2,s3)
REPLACE('abc','b','d') 結果adc
查找公司員工編號,用戶名(first_name與last_name連接成一個字符串),職位編號及last_name的長度,要求職位從第四位起匹配'ACCOUNT',同時last_name中至少包含一個’e’字母。
SELECT employee_id, CONCAT(first_name, last_name)
NAME, job_id, LENGTH (last_name) length
FROM employees
WHERE SUBSTR(job_id, 4) = 'ACCOUNT'
AND INSTR(last_name, 'e')>0;
4數字函數
ROUND(列名|表達式, n):將列或表達式所表示的數值四捨五入到小數點後的第n位。
TRUNC(列名|表達式,n):將列或表達式所表示的數值截取到小數點後的第n位。
MOD(m,n):取m除以n後得到的餘數。
5日期函數
常用的日期運算如下:
–日期類型列或表達式可以加減數字,功能是在該日期上加減對應的天數。如:’10-AUG-06’+15結果是’25-AUG-06’。
–日期類型列或表達式之間可以進行減操作,功能是計算兩個日期之間間隔了多少天。如:’10-AUG-06’-‘4-AUG-06’結果四捨五入後是6天。
–如果需要加減相應小時或分鐘,可以使用n/24來實現
SYSDATE:返回系統日期
•MONTHS_BETWEEN:返回兩個日期間隔的月數
•ADD_MONTHS:在指定日期基礎上加上相應的月數
•NEXT_DAY:返回某一日期的下一個指定日期
•LAST_DAY:返回指定日期當月最後一天的日期
•ROUND(date[,'fmt'])將date按照fmt指定的格式進行四捨五入,fmt爲可選項,如果沒有指定fmt,則默認爲DD’,將date四捨五入爲最近的天。
格式碼:世紀CC,年YY,月MM,日DD,小時HH24,分MI,秒SS
•TRUNC(date[,'fmt'])將date按照fmt指定的格式進行截取,fmt爲可選項,如果沒有指定fmt,則默認爲‘DD’,將date截取爲最近的天。
•EXTRACT:返回從日期類型中取出指定年、月、日
MONTHS_BETWEEN 函數演示——公司員工服務的月數。
SELECT last_name, salary, MONTHS_BETWEEN(SYSDATE,hire_date) months
FROM employees
ORDER BY months;
ADD_MONTHS 函數演示——99年公司員工轉正日期。
SELECT last_name, salary, hire_date, ADD_MONTHS(hire_date,3) new_date
FROM employees
WHERE hire_date>'01-1月-1999';
NEXT_DAY 函數演示——下週一的日期。
SELECT NEXT_DAY('02-2月-06','星期一') NEXT_DAY FROM DUAL;
LAST_DAY 函數演示——06年2月2日所在月份最後一天。
SELECT LAST_DAY('02-2月-2006') "LAST DAY" FROM DUAL;
ROUND函數演示——98年入職員工入職日期按月四捨五入。
SELECT employee_id, hire_date, ROUND(hire_date, 'MONTH') FROM employees WHERE SUBSTR(hire_date,-2,2)='98';
TRUNC 函數演示——98年入職員工入職日期按月截斷。
SELECT employee_id, hire_date, TRUNC(hire_date, 'MONTH') FROM employees WHERE SUBSTR(hire_date,-2,2)='98';
EXTRACT 函數語法
部門編號是90的部門中所有員工入職月份。
EXTRACT ([YEAR] [MONTH][DAY] FROM [日期類型表達式])
SELECT last_name, hire_date, EXTRACT (MONTH FROM HIRE_DATE) MONTH FROM employees WHERE department_id = 90;
6轉換函數
數據類型轉換分爲隱式轉化和顯示轉換
對數據進行隱式轉換
對於INSERT和UPDATE操作,oracle會把插入值或者更新值隱式轉換爲字段的數據類型
–對於SELECT語句,oracle會把字段的數據類型隱式轉換爲變量的數據類型
–當比較一個字符型和數值型的值時,oracle會把字符型的值隱式轉換爲數值型
–當比較字符型和日期型的數據時,oracle會把字符型轉換爲日期型
–用連接操作符(||)時,oracle會把非字符類型的數據轉換爲字符類型
–如果字符類型的數據和非字符類型的數據(如number、date、rowid等)作算術運算,則oracle會將字符類型的數據轉換爲合適的數據類型,這些數據類型可能是number、date、rowid等
數據類型的顯示轉換,通常是在字符類型,日期類型,數字類型直接進行顯示轉換
主要有3個顯性函數
-TO_CHAR
-TO_NUMBER
-TO_DATE
TO_CHAR(date|number [,‘fmt’])把日期類型/數字類型的表達式或列轉換爲字符類型。
–‘fmt’指的是需要顯示的格式:
–需要寫在單引號中,並且是大小寫敏感
–可包含任何有效的日期格式
常用日期格式
–YYYY:4位數字表示年份;
–YY:2位數字表示年份,但是無世紀轉換(與RR區別在後面章節介紹);
–RR:2位數字表示年份,有世紀轉換(與YY區別在後面章節介紹);
–YEAR:年份的英文拼寫;
–MM:兩位數字表示月份;
–MONTH:月份英文拼寫;
–DY:星期的英文前三位字母;
–DAY:星期的英文拼寫;
–D:數字表示一星期的第幾天,星期天是一週的第一天。
–DD:數字表示一個月中的第幾天;
–DDD:數字表示一年中的第幾天。
–AM 或PM:上下午表示;
–HH 或HH12或HH24:數字表示小時。HH12代表12小時計時,HH24代表24小時計時;
–MI:數字表示分鐘;
–SS:數字表示秒;
一些特殊格式
–TH:顯示數字表示的英文序數詞,如:DDTH顯示天數的序數詞。
–SP:顯示數字表示的拼寫。
–SPTH:顯示數字表示的序數詞的拼寫。
–“字符串”:如在格式中顯示字符串,需要兩端加雙引號。
TO_CHAR(SYSDATE,’DDSPTH’)
TO_CHAR(SYSDATE,’DD “of” MONTH ‘)
select to_char(sysdate,'YYYY-MM-DD')
from dual;
TO_NUMBER(char[,’fmt’]) 把字符類型列或表達式轉換爲數字類型。
–使用格式和TO_CHAR中轉換成字符類型中的格式相同
TO_DATE(char[,‘fmt’]) 把字符類型列或表達式轉換爲日期類型。
–格式和TO_CHAR中轉換成字符類型中的格式相同。
具體格式如下:
–9:一位數字;
–0:一位數字或前導零;
–$:顯示爲美元符號;
–L:顯示按照區域設置的本地貨幣符號;
–.:小數點;
–,:千位分割符;
TO_CHAR 函數進行數字到字符型格式轉換
注意:進行數字類型到字符型轉換,格式中的寬度一定要超過實際列寬度,否則會顯示爲###。
SELECT last_name, TO_CHAR(salary, '$99,999.00') salary FROM employees WHERE last_name = 'King';
SELECT last_name, TO_CHAR(salary, '$9,999.00') salary FROM employees WHERE last_name = 'King';
7RR功能
8通用函數
與空值(NULL)相關的一些函數,完成對空值(NULL)的一些操作。主要包括以下函數:
–NVL
–NVL2
–NULLIF
–COALESCE
條件處理函數:
–CASE表達式
–DECODE
NVL (表達式1, 表達式2)函數功能是空值轉換,把空值轉換爲其他值,解決空值問題。表達式1是需要轉換的列或表達式,表達式2是如果第一個參數爲空時,需要轉換的值。
–NVL(comm,0)
–NVL(hire_date,'01-JAN-06')
–NVL(job_id,'No Job Yet')
注意:數據格式可以是日期、字符、數字,但數據類型必須匹配。
NVL2(表達式1, 表達式2, 表達式3)函數是對第一個參數進行檢查。如果第一個參數不爲空,則輸出第二個參數;如果第一個參數爲空,則輸出第三個參數。表達式1可以爲任何數據類型
NULLIF (表達式1, 表達式2)函數主要是完成兩個參數的比較。當兩個參數不相等時,返回值是第一個參數值;當兩個參數相等時,返回值是空值。
COALESCE (表達式1, 表達式2, ... 表達式n)函數是對NVL函數的擴展。COALESCE函數的功能是返回第一個不爲空的參數,參數個數不受限制。
CASE語法
CASE expr WHEN comparison_expr1 THEN return_expr1 [WHEN comparison_expr2 THEN return_expr2 WHEN comparison_exprn THEN return_exprn ELSE else_expr] END
SELECT last_name, commission_pct,
(CASE commission_pct
WHEN 0.1 THEN '低'
WHEN 0.2 THEN '中'
WHEN 0.3 THEN '高'
ELSE '無'
END) Commission
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY last_name;
DECODE(字段|表達式, 條件1,結果1[,條件2,結果2…,][,缺省值])
SELECT last_name, commission_pct, decode(commission_pct, 0.1,'低', 0.2,'中', 0.3 , '高', '無') Commission FROM employees WHERE commission_pct IS NOT NULL ORDER BY last_name;
9嵌套函數
單行函數可以嵌套於任何層。
嵌套的函數是從最裏層向最外層的順序計算的。
SELECT employee_id,manager_id , NVL2(TO_CHAR(manager_id),to_char(manager_id),'No Manager') FROM employees