| 函數 | 語法 | 說明 |
|---|---|---|
SUBSTRING_INDEX | SUBSTRING_INDEX(str, delim, count) | count>0:返回第 count 個分隔符左側內容;count<0:返回第 |count| 個分隔符右側內容 |
CONCAT | CONCAT(str1, str2, ...) | 拼接字符串,任一參數為 NULL 則結果為 NULL |
原始數據:010-88888882-5612
SELECT
SUBSTRING_INDEX(phone, '-', 2) AS PNumber, -- 總機:前 2 段
SUBSTRING_INDEX(phone, '-', -1) AS Ext, -- 分機:最後 1 段
phone
FROM tb_user
WHERE ucid = 271338;
結果:
| PNumber | Ext | phone |
|---|---|---|
| 010-88888882 | 5612 | 010-88888882-5612 |
將分機改為 1234:
UPDATE tb_user
SET phone = CONCAT(
SUBSTRING_INDEX(phone, '-', 2), -- 保留總機
'-', -- 分隔符
'1234' -- 新分機
)
WHERE ucid = 271338;
| 需求 | SQL 片段 |
|---|---|
| 取第 3 段(不存在返回整串) | SUBSTRING_INDEX(phone, '-', 3) |
| 取倒數第 2 段 | SUBSTRING_INDEX(SUBSTRING_INDEX(phone, '-', -2), '-', 1) |
| 統一分隔符為空格 | REPLACE(phone, '-', ' ') |
| 防 NULL 安全拼接 | CONCAT_WS('-', part1, part2, part3)(自動跳過 NULL) |
SUBSTRING_INDEX 為字符串掃描,大表高頻調用建議冗余存儲拆分列或建立虛擬列索引(MySQL 5.7+);