首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 字串截取與拆分函數實戰:SUBSTRING 與 SUBSTRING_INDEX 進階用法

     編輯:MySQL 資料庫相關知識

前言

在日常開發中,常需從欄位中擷取特定片段或按分隔符拆分字串。MySQL 提供 SUBSTRING() 與 SUBSTRING_INDEX() 兩大核心函數,組合使用可應對極其複雜的解析需求。本文透過實例逐層拆解,助你靈活駕馭字串處理。

一、SUBSTRING():靈活的子字串擷取器

SUBSTRING(str, pos[, len])
-- pos 為起始位置(1 起始,負數表示從尾部倒數)
-- len 為長度,省略則截取到結尾

常見用法示例

  • SUBSTRING(comment_id, 9) — 從第 9 個字元截取至末尾。
  • SUBSTRING(comment_id, -5, 3) — 從倒數第 5 個字元起取 3 個字元。

二、SUBSTRING_INDEX():分隔符拆分利器

SUBSTRING_INDEX(str, delim, count)
-- count > 0:從左往右數第 count 個 delim 之前的子串
-- count < 0:從右往左數第 |count| 個 delim 之後的子串

核心範例:字串 'c-11065-50'

需求SQL 寫法結果
取最後一段 50SUBSTRING_INDEX(check_id, '-', -1)50
取中間段 11065SUBSTRING_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'。大數據量下減少一次函數呼叫,效能提升顯著。

四、效能建議

  1. 能用單層 SUBSTRING_INDEX 解決就不嵌套。
  2. 高頻查詢建議在應用層預處理或新增計算欄位/虛擬欄位(MySQL 5.7+ 支援 Generated Column)並建索引。
  3. 避免在 WHERE 條件中對大字段做複雜字串運算,導致全表掃描。

五、延伸閱讀

  • MySQL 官方文檔:String Functions
  • 本站專題:《MySQL 常用函數大匯總》《MySQL 存儲過程技巧大全》
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved