Oracle 函數概述
在 Oracle 資料庫中,函數是接受零個或多個參數並返回單一值的程式單元。SQL 與 PL/SQL 內建了豐富的函數庫,主要分為兩大類:單行函數與群組函數(多行函數)。單行函數逐行操作資料,可用於 SELECT、WHERE、ORDER BY 等子句;群組函數則對多行資料彙總計算,常搭配 GROUP BY 使用。
單行函數詳細分類
1. 字元函數
用於處理字串資料,常見函數包括:
- ASCII/CHR:字元與 ASCII 碼互轉
- CONCAT/||:字串串聯,CONCAT 可處理 NULL 值
- INITCAP:每個單字首字母大寫
- INSTR/INSTRB:搜尋子字串位置,支援從右向左搜尋
- LENGTH/LENGTHB:取得字串長度(字元/位元組)
- LOWER/UPPER:大小寫轉換,常用於 WHERE 條件比對
- LPAD/RPAD:左/右側填充字串至指定長度
- LTRIM/RTRIM/TRIM:移除前導/尾隨/兩側特定字元
- REPLACE:字串替換,支援 NULL 參數
- SUBSTR/SUBSTRB:擷取子字串(字元/位元組為單位)
- SOUNDEX:依發音相似度比對字串
- TRANSLATE:字元級別的逐一替換
2. 數值函數
執行數學運算,所有三角函數參數均為弧度:
- ABS/CEIL/FLOOR/ROUND/TRUNC:絕對值、捨入、截斷
- POWER/SQRT/EXP/LN/LOG:冪、平方根、指數、對數
- MOD:求餘數
- SIGN:正負號判斷
- SIN/COS/TAN 及雙曲函數:三角運算
3. 日期函數
操作 DATE 型別資料,多數返回 DATE 值:
- SYSDATE:取得目前日期時間
- ADD_MONTHS:日期加減月份
- LAST_DAY:該月最後一天
- MONTHS_BETWEEN:兩日期間月數差異
- NEXT_DAY:指定週名之後的第一天
- ROUND/TRUNC:日期捨入/截斷至指定單位
- NEW_TIME:時區轉換
4. 轉換函數
資料型別間轉換:
- TO_CHAR:數值/日期轉字串,支援格式模板與 NLS 參數
- TO_DATE:字串轉日期
- TO_NUMBER:字串轉數值
- HEXTORAW/RAWTOHEX:16 進位與 RAW 互轉
- ROWIDTOCHAR/CHARTOROWID:ROWID 與 CHAR 互轉
5. 其他單行函數
- NVL/DECODE:NULL 處理與條件邏輯,NVL(x1,x2) 若 x1 為 NULL 則回傳 x2
- GREATEST/LEAST:多值最大/最小值
- USER/UID/USERENV:會話資訊
- VSIZE/DUMP:內部表示位元組數與診斷資訊
- BFILENAME/EMPTY_BLOB/EMPTY_CLOB:LOB 初始化
NULL 值與單行函數的關鍵行為
算術運算遇 NULL 結果為 NULL,多數函數亦同。例外函數:CONCAT、DECODE、DUMP、NVL、REPLACE 在引數為 NULL 時仍可回傳非 NULL。實務上常用 NVL(bonus,0) 避免薪資+獎金計算因 NULL 導致結果為 NULL。
群組函數(多行函數)
對多行資料彙總,回傳單一結果。常用於 SELECT 或 HAVING 子句,常搭配 GROUP BY:
- AVG/COUNT/MAX/MIN/SUM:平均、計數、最大/最小、總和
- STDDEV/VARIANCE:標準差與變異數
- 支援 DISTINCT/ALL 修飾詞
GROUP BY 與 HAVING 進階應用
GROUP BY 依指定欄位分組,SELECT 清單中非彙總欄位必須出現在 GROUP BY 中。HAVING 用於過濾分組後的結果,彌補 WHERE 無法使用群組函數的限制。正確順序:WHERE → GROUP BY → HAVING → ORDER BY。
實務範例
-- 單行函數綜合應用
SELECT ename,
TO_CHAR(hiredate, 'Day, DD-Mon-YYYY') AS hire_date,
UPPER(ename) AS upper_name
FROM emp
WHERE UPPER(ename) LIKE 'AL%'
ORDER BY SOUNDEX(ename);
-- 群組函數與 HAVING
SELECT sales_clerk, SUM(sale_amount) AS total_sales
FROM gross_sales
WHERE sales_dept = 'OUTSIDE'
GROUP BY sales_clerk
HAVING SUM(sale_amount) > 10000
ORDER BY total_sales DESC;