首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 內建函數完整參考手冊:數值、字元、日期、轉換、雜項六大類詳解

     編輯:Oracle 資料庫基礎

前言

Oracle 提供豐富的單列函數,掌握核心函數能大幅簡化 SQL、提升效能。本文系統整理六大類函數:語法、參數、回傳值、實戰範例與避坑指南。

一、數值函數

函數語法說明範例
ABSABS(n)絕對值ABS(-1000000.01) → 1000000.01
ROUNDROUND(n[,m])四捨五入,m 為小數位 (負數向左)ROUND(23.56,1)=23.6, ROUND(23.56,-1)=20
TRUNCTRUNC(n[,m])截斷,不四捨五入TRUNC(23.56,1)=23.5, TRUNC(23.56,-1)=20
CEILCEIL(n)≥n 的最小整數CEIL(18.2)=19, CEIL(-18.2)=-18
FLOORFLOOR(n)≤n 的最大整數FLOOR(2.2)=2, FLOOR(-2.2)=-3
MODMOD(n1,n2)餘數,n2=0 回傳 n1MOD(24,5)=4
POWERPOWER(n1,n2)n1 的 n2 次方POWER(2,3)=8
SQRTSQRT(n)平方根 (n≥0)SQRT(0.1)=0.316...
EXPEXP(n)e 的 n 次方EXP(1)=2.718...
LNLN(n)自然對數 (n>0)LN(0.9)=-0.105...
LOGLOG(b,n)以 b 為底 n 的對數LOG(10,100)=2
SIGNSIGN(n)正負號:1/0/-1SIGN(-14)=-1
BITANDBITAND(n1,n2)位元 AND 運算BITAND(3,9)=1 (0011 & 1001 = 0001)
BIN_TO_NUMBIN_TO_NUM(b1,b2...)二進位位元轉十進位BIN_TO_NUM(1,0,1)=5
三角函數SIN/COS/TAN/ASIN/ACOS/ATAN/ATAN2/SINH/COSH/TANH弧度制SIN(10), ACOS(0.9)

二、字元函數 (回傳字元)

函數語法說明範例
LOWER/UPPERLOWER(c), UPPER(c)大小寫轉換UPPER('abc')='ABC'
INITCAPINITCAP(c)每單字首字大寫INITCAP('hello world')='Hello World'
NLS_INITCAPNLS_INITCAP(c[,nls])支援多語言排序規則NLS_INITCAP('中華minzhu')
LPADLPAD(c1,n[,c2])左填充至長度 nLPAD('abc',6,'-')='---abc'
RPADRPAD(c1,n[,c2])右填充至長度 nRPAD('abc',6,'-')='abc---'
LTRIMLTRIM(c1[,c2])移除左側字元 (預設空格)LTRIM(' abc')='abc', LTRIM('xyabc','xy')='abc'
RTRIMRTRIM(c1[,c2])移除右側字元RTRIM('abc ' )='abc'
TRIMTRIM([LEADING|TRAILING|BOTH] c2 FROM c1)移除首/尾/兩側指定字元TRIM('W' FROM 'WabcW')='abc'
REPLACEREPLACE(c1,c2[,c3])替換 c2 為 c3 (c3 為空則刪除)REPLACE('abc','b','X')='aXc'
TRANSLATETRANSLATE(c1,c2,c3)字元對字元對應替換 (非字串替換)TRANSLATE('abc','ab','12')='12c'
SUBSTRSUBSTR(c,pos[,len])擷取子字串,pos<0 從右算起SUBSTR('abcdef',-3,2)='de'
CONCATCONCAT(c1,c2)串接 (等同 ||)CONCAT('a','b')='ab'
CHRCHR(n [USING NCHAR_CS])數值對應字元集字元CHR(65)='A'
SOUNDEXSOUNDEX(c)語音編碼 (同音異字比對)SOUNDEX('dog')='D200', SOUNDEX('boy')='B000'

SUBSTR 陷阱總結

  • pos=0 視同 pos=1
  • pos>0:從左往右;pos<0:從右往左
  • pos > LENGTH(c) 回傳 NULL
  • len < 1 回傳 NULL

三、字元函數 (回傳數值)

函數語法說明範例
INSTRINSTR(c1,c2[,pos[,occur]])搜尋 c2 在 c1 位置,pos<0 從右找INSTR('abcdef','c',-1)=3
LENGTHLENGTH(c)字串長度 (字元數)LENGTH('中文')=2
ASCIIASCII(c)首字元對應數值ASCII('_')=95
VSIZEVSIZE(c)位元組數VSIZE('abc中')=7 (UTF8)

四、日期函數

函數語法說明範例
SYSDATESYSDATE資料庫伺服器當前日期時間2024-01-15 14:30:00
CURRENT_DATECURRENT_DATESession 時區當前日期可能與 SYSDATE 差 1 秒
SYSTIMESTAMPSYSTIMESTAMP([prec])資料庫時區 + 毫秒精度SYSTIMESTAMP(3)
CURRENT_TIMESTAMPCURRENT_TIMESTAMP([prec])Session 時區 + 毫秒CURRENT_TIMESTAMP(6)
LOCALTIMESTAMPLOCALTIMESTAMP([prec])Session 時區 (無時區資訊)LOCALTIMESTAMP(3)
ADD_MONTHSADD_MONTHS(d,n)加減月份 (n 可負)ADD_MONTHS(SYSDATE,-12)
MONTHS_BETWEENMONTHS_BETWEEN(d1,d2)月份差 (可負、含小數)MONTHS_BETWEEN(d1,d2)
LAST_DAYLAST_DAY(d)該月最後一天LAST_DAY(SYSDATE)
NEXT_DAYNEXT_DAY(d,day)下一個指定週幾 (需符合 NLS_LANGUAGE)NEXT_DAY(SYSDATE,'星期一')
ROUNDROUND(d[,fmt])日期四捨五入 (fmt: YEAR, MONTH, DAY, HH...)ROUND(SYSDATE,'MONTH')
TRUNCTRUNC(d[,fmt])日期截斷TRUNC(SYSDATE,'HH24')
EXTRACTEXTRACT(field FROM d)擷取年/月/日/時/分/秒EXTRACT(YEAR FROM SYSDATE)
TO_TIMESTAMPTO_TIMESTAMP(c[,fmt])字串轉 TIMESTAMPTO_TIMESTAMP('2024-01-15','YYYY-MM-DD')

NEXT_DAY 時區陷阱


-- Session NLS_LANGUAGE = SIMPLIFIED CHINESE
NEXT_DAY(SYSDATE, '星期一')  -- 正確
NEXT_DAY(SYSDATE, 'Monday')  -- ORA-01846: not a valid day of the week

五、轉換函數

函數語法說明範例
TO_CHARTO_CHAR(n|d[,fmt[,nls]])數值/日期 → 字串TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')
TO_NUMBERTO_NUMBER(c[,fmt[,nls]])字串 → 數值TO_NUMBER('-100.00','9G999D99')
TO_DATETO_DATE(c[,fmt[,nls]])字串 → DATETO_DATE('2024-01-15','YYYY-MM-DD')
TO_TIMESTAMPTO_TIMESTAMP(c[,fmt])字串 → TIMESTAMPTO_TIMESTAMP('2024-01-15 14:30','YYYY-MM-DD HH24:MI')
CASTCAST(expr AS type)標準 SQL 轉型CAST('123' AS NUMBER(5))
BIN_TO_NUMBIN_TO_NUM(b1,b2...)位元向量轉數值BIN_TO_NUM(1,1,0)=6
CHARTOROWIDCHARTOROWID(c)字串 → ROWIDCHARTOROWID('AAAR...')
ROWIDTOCHARROWIDTOCHAR(rowid)ROWID → VARCHAR2(18)ROWIDTOCHAR(rowid)
TO_MULTI_BYTETO_MULTI_BYTE(c)半形 → 全形TO_MULTI_BYTE('ABC')
TO_SINGLE_BYTETO_SINGLE_BYTE(c)全形 → 半形TO_SINGLE_BYTE('ABC')

TO_DATE 'J' 格式 (Julian Day)


-- Julian Day 範圍:1 (BC 4712-01-01) ~ 5373484 (AD 9999-12-31)
SELECT TO_DATE(2454336, 'J') FROM DUAL;  -- 2007-08-23
SELECT TO_CHAR(TO_DATE('9999-12-31','YYYY-MM-DD'), 'J') FROM DUAL;  -- 5373484

六、雜項單列函數

函數語法說明範例
NVLNVL(expr1, expr2)expr1 為 NULL 回傳 expr2NVL(NULL, 'N/A')='N/A'
NVL2NVL2(expr1, expr2, expr3)expr1 不為 NULL 回傳 expr2,否則 expr3NVL2('x','Y','N')='Y'
COALESCECOALESCE(e1,e2...)回傳第一個非 NULLCOALESCE(NULL,5,NULL,9)=5
NULLIFNULLIF(e1,e2)e1=e2 回傳 NULL,否則 e1NULLIF('a','a')=NULL
DECODEDECODE(exp, s1,r1, s2,r2..., def)類比 IF-ELSE 鏈DECODE(x,'A',1,'B',2,0)
CASECASE WHEN...THEN...ELSE...END標準 SQL 條件表達式CASE WHEN x>0 THEN 'P' ELSE 'N' END
GREATESTGREATEST(e1,e2...)最大值GREATEST(15,5,75,8)=75
LEASTLEAST(e1,e2...)最小值LEAST(15,5,75,8)=5
SYS_CONTEXTSYS_CONTEXT('USERENV', param[,len])取得 Session 環境資訊SYS_CONTEXT('USERENV','SESSION_USER')
SYS_CONNECT_BY_PATHSYS_CONNECT_BY_PATH(col, sep)階層查詢路徑串接需搭配 CONNECT BY
UIDUID當前使用者唯一整數 IDUID
USERUSER當前 Session 使用者名USER
USERENVUSERENV(param)舊版函數,建議改用 SYS_CONTEXTUSERENV('LANGUAGE')
DUMPDUMP(expr[,fmt[,start[,len]]])內部儲存表示 (8/10/16/17 進制)DUMP('abc',17,2,4)
EMPTY_BLOB/CLOBEMPTY_BLOB(), EMPTY_CLOB()初始化 LOB 定位器INSERT ... VALUES (EMPTY_BLOB())
NLS_CHARSET_NAME/ID/DECL_LEN...字元集元資料查詢NLS_CHARSET_ID('US7ASCII')
SYS_EXTRACT_UTCSYS_EXTRACT_UTC(ts)轉換為 UTC (格林威治時間)SYS_EXTRACT_UTC(CURRENT_TIMESTAMP)
SYS_TYPEIDSYS_TYPEID(obj)物件類型 ID自定義類型使用

七、常用格式模型速查

類別常用格式元素
日期YYYY, MM, DD, HH24, MI, SS, MON, DY, DAY, J, RM, Q, WW, IW
數值9 (數字), 0 (前導零), . (小數點), G (群組分隔), D (小數字元), L (貨幣符號), MI (負號後綴), PR (括號負數), FM (填充模式關閉)

結語

熟練掌握 Oracle 內建函數,能將複雜邏輯下推至資料庫層執行,減少網路傳輸、簡化應用程式碼。建議:優先使用標準 SQL 函數 (CASE, CAST, COALESCE) 以利跨平台遷移;Oracle 專有函數 (DECODE, NVL, SYS_CONTEXT) 用於效能敏感或平台綁定場景。隨手查閱 V$SQLFN_METADATA (12c+) 可獲取完整函數元資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved