標準 SQL SUBSTRING (同義 SUBSTR) 用於字串截取,支援正負起始位置、長度參數,與 Java substring 行為不同,易踩坑。
語法
SUBSTRING(str, start, length)
SUBSTR(str, start, length)
str:目標字串。
start:起始位置 1-based。
— 正數:從左向右數 (1 為第一字元)。
— 負數:從右向左數 (-1 為最後一字元)。
— 0:視同 1。
length:可選,截取長度。省略則截至字串結尾。
範例對照表
| SQL | 結果 | 說明 |
SUBSTRING('abcdefg', 3, 4) | cdef | 從第 3 字元取 4 碼 |
SUBSTRING('abcdefg', -3, 4) | efg | 從倒數第 3 字元取 4 碼 (實際僅剩 3 碼) |
SUBSTRING('abcdefg', 0, 3) | abc | 0 視同 1 |
SUBSTRING('abcdefg', 1, 3) | abc | 標準用法 |
與 Java substring 關鍵差異
| 維度 | SQL SUBSTRING | Java String.substring |
| 索引基準 | 1-based | 0-based |
| 參數語義 | start, length | beginIndex, endIndex (不含 endIndex) |
| 負數支援 | 支援 (從右數) | 不支援 (拋 StringIndexOutOfBoundsException) |
| 範例 | SUBSTRING('abc', -1, 1) → 'c' | "abc".substring(1, 3) → "bc" |
常見陷阱
- 把 Java 0-based 思維套用 SQL,導致截取偏移一位。
- SQL
length 參數可省略,Java endIndex 省略則截至結尾,語義相近但索引不同。
- Oracle
SUBSTR 行為與標準 SQL 一致;SQL Server SUBSTRING 不支援負數 start (需用 RIGHT/LEFT)。
實戰建議
- 統一團隊規約:SQL 層面截取優先用
SUBSTRING(str, pos, len),正數 pos 從左,負數從右。
- 複雜截取邏輯下推應用層 (Java/Python/Go) 處理,SQL 僅做簡單切分。
- 單元測試覆蓋邊界:空字串、長度不足、負數起始、零起始。
- 上一篇文章: SQL 語言基礎知識體系
- 下一篇文章: 遞歸 CTE 解決父子級 ID 關聯更新:MySQL/SQL Server 通用寫法與遊標對比
Copyright ©
程式碼之家 All Rights Reserved