語法與基本用法
CONCAT(str1, str2, ...)
-- 返回拼接後字符串
-- 任一參數為 NULL → 返回 NULL
-- 全非二進制串 → 結果非二進制
-- 含二進制串 → 結果二進制
-- 數值隱式轉二進制串 → 建議 CAST(x AS CHAR)
實戰範例
SELECT CONCAT('10'); -- '10'
SELECT CONCAT('11','22','33'); -- '112233'
SELECT CONCAT('11','22',NULL); -- NULL ← 核心陷阱
NULL 安全拼接方案
| 方案 | 語法 | 示例結果 | 適用版本 |
CONCAT_WS | CONCAT_WS(sep, str1, str2...) | CONCAT_WS(',', 'a', NULL, 'c') → 'a,c' | 所有版本 |
IFNULL/COALESCE | CONCAT(IFNULL(a,''), IFNULL(b,'')) | 手動轉空串 | 所有版本 |
CONCAT + NULLIF | 罕用 | - | - |
推薦:CONCAT_WS(With Separator)
-- 拼接姓名
SELECT CONCAT_WS(' ', first_name, middle_name, last_name) FROM users;
-- 中間名為 NULL 時不會產生雙空格
-- 拼接地址
SELECT CONCAT_WS(', ', province, city, district, address) FROM addr;
數值拼接隱式轉換
SELECT CONCAT(123, 'abc'); -- '123abc' (數值→二進制串)
SELECT CONCAT(CAST(123 AS CHAR), 'abc'); -- 顯式轉換,更安全
GROUP_CONCAT:聚合拼接
SELECT GROUP_CONCAT(name ORDER BY id SEPARATOR ',') FROM users;
-- 可配合 GROUP BY 分組拼接
-- 受 group_concat_max_len 限制(默認 1024),大數據需調大
性能提示
- 大量拼接考慮應用層組裝,減少 SQL CPU
CONCAT 在 WHERE/JOIN ON 中導致索引失效
- 導出 CSV 時用
SELECT ... INTO OUTFILE 配合 FIELDS TERMINATED BY 更高效