各大資料庫對「字串子集擷取」的函數命名、參數語意略有不同,開發跨平台 SQL 時極易踩坑。
| 資料庫 | 函數名稱 | 語法 | 起始位置基數 | 備註 |
|---|---|---|---|---|
| MySQL | SUBSTR() / SUBSTRING() | SUBSTR(str, pos[, len]) | 1-based | 支援負數位置(從右往左數) |
| Oracle | SUBSTR() | SUBSTR(str, pos[, len]) | 1-based | 負數位置 = 從末尾往前;len 可省略(截到尾) |
| SQL Server | SUBSTRING() | SUBSTRING(expression, start, length) | 1-based | length 必填;不支援負數 start |
| PostgreSQL | SUBSTRING() / SUBSTR() | SUBSTRING(str FROM pos [FOR len]) 或 SUBSTR(str, pos[, len]) | 1-based | 支援標準 SQL FROM ... FOR 語法 |
-- MySQL / Oracle / PostgreSQL
SUBSTR('abcdef', 3) -- 回傳 'cdef'
SUBSTRING('abcdef' FROM 3) -- PostgreSQL 標準寫法
-- SQL Server (必須給 length,可用大數值或 LEN)
SUBSTRING('abcdef', 3, 100) -- 回傳 'cdef'
-- 通用寫法 (MySQL/Oracle/PostgreSQL/SQL Server 皆支援)
SUBSTR('abcdef', 2, 3) -- 回傳 'bcd'
SUBSTRING('abcdef', 2, 3) -- SQL Server / 標準
SUBSTR('abcdef', -3) -- 回傳 'def' (最後 3 字元)
SUBSTR('abcdef', -4, 2) -- 回傳 'cd' (倒數第 4 字元起 2 碼)
-- SQL Server 不支援,需用 LEN 計算:
SUBSTRING('abcdef', LEN('abcdef') - 3 + 1, 3) -- 'def'
(字串, 起始位置, 長度),但 PostgreSQL 另提供 FROM ... FOR 關鍵字語法。CAST/CONVERT。dbo.fn_Substr(str, pos, len),內部對應各平台語法。SUBSTR/SUBSTRING 雖是最基礎的字串函數,卻因歷史演進導致跨平台差異最大。記住「**SQL Server 必填長度、負數不支援、1-based 起算**」三鐵律,搭配上表快速查閱,即可在多資料庫環境下寫出正確、可移植的字串擷取邏輯。