在日常開發中,常需從欄位中擷取特定片段或按分隔符拆分字串。MySQL 提供 SUBSTRING() 與 SUBSTRING_INDEX() 兩大核心函數,組合使用可應對極其複雜的解析需求。本文透過實例逐層拆解,助你靈活駕馭字串處理。
SUBSTRING(str, pos[, len]) -- pos 為起始位置(1 起始,負數表示從尾部倒數) -- len 為長度,省略則截取到結尾
SUBSTRING(comment_id, 9) — 從第 9 個字元截取至末尾。SUBSTRING(comment_id, -5, 3) — 從倒數第 5 個字元起取 3 個字元。SUBSTRING_INDEX(str, delim, count) -- count > 0:從左往右數第 count 個 delim 之前的子串 -- count < 0:從右往左數第 |count| 個 delim 之後的子串
'c-11065-50'| 需求 | SQL 寫法 | 結果 |
|---|---|---|
取最後一段 50 | SUBSTRING_INDEX(check_id, '-', -1) | 50 |
取中間段 11065 | SUBSTRING_INDEX(SUBSTRING_INDEX(check_id, '-', -2), '-', 1) | 11065 |
| 同樣取中間段(另一種寫法) | SUBSTRING_INDEX(SUBSTRING_INDEX(check_id, '-', 2), '-', -1) | 11065 |
字串 'content_13-11220-1',需取出 13。
SELECT SUBSTRING_INDEX(
SUBSTRING_INDEX(
SUBSTRING(comment_id, 9), '-', 1), '-', -1)
FROM `check` WHERE comment_id = 'content_13-11220-1';
SELECT SUBSTRING_INDEX(
SUBSTRING_INDEX(comment_id, '-', 1), '_', -1)
FROM `check` WHERE comment_id = 'content_13-11220-1';
解析:先按 - 取第一段 'content_13',再按 _ 取最後一段 '13'。大數據量下減少一次函數呼叫,效能提升顯著。
SUBSTRING_INDEX 解決就不嵌套。WHERE 條件中對大字段做複雜字串運算,導致全表掃描。