MySQL 提供兩個常用的字符串拼接函數:CONCAT() 與 CONCAT_WS()。它們在處理 NULL 值、分隔符使用上有顯著差異,選擇合適的函數能簡化查詢邏輯。
直接拼接所有參數,任一參數為 NULL 則結果為 NULL。
SELECT CONCAT('1','2','3'); -- 返回 '123'
SELECT CONCAT('1','2',NULL,'3'); -- 返回 NULL
With Separator,第一個參數為分隔符,分隔符為 NULL 時結果為 NULL;後續參數中的 NULL 會被自動忽略,不會導致整體為 NULL。
SELECT CONCAT_WS(':','1','2','3'); -- 返回 '1:2:3'
SELECT CONCAT_WS(NULL,'1','2','3'); -- 返回 NULL(分隔符為NULL)
SELECT CONCAT_WS(':','1','2',NULL,NULL,'3'); -- 返回 '1:2:3'(忽略NULL)
若需將 NULL 替換為預設值再拼接,可嵌套 IFNULL() 或 COALESCE()。
SELECT CONCAT_WS(':','1','2',IFNULL(NULL,'0'),'3'); -- 返回 '1:2:0:3'
| 場景 | 推薦函數 | 理由 |
|---|---|---|
| 簡單拼接,確定無 NULL | CONCAT | 語法簡潔,性能略優 |
| 字段可能含 NULL,需忽略 | CONCAT_WS | 自動跳過 NULL,無需額外判斷 |
| 需要自定義分隔符(如 CSV、標籤拼接) | CONCAT_WS | 內建分隔符參數,避免手動拼接分隔符 |
| 分隔符本身可能為 NULL | CONCAT | CONCAT_WS 分隔符為 NULL 直接返回 NULL |
CONCAT:全非 NULL 才返回結果,適合嚴格拼接。CONCAT_WS:分隔符非 NULL 時,自動過濾後續 NULL,適合彈性拼接、生成分隔字符串。IFNULL/COALESCE 預處理字段。