在 MySQL 中拼接字符串是一個非常常見的操作,主要用于查詢時動態組合多個字段或值。以下是幾種最核心和常用的方法。
-
CONCAT(str1, str2, ...)
這是最通用、最常用的字符串拼接函數。它接受兩個或多個字符串參數,并將它們按順序連接成一個字符串。
如果參數中有 NULL,則 CONCAT 的結果為 NULL。這是最重要的一點。
SELECT CONCAT('Hello', ' ', 'World') AS greeting; -- 結果: 'Hello World' SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users; -- 結果: 將 first_name 和 last_name 用空格連接起來 SELECT CONCAT('User ID: ', id, ', Name: ', name) AS user_info FROM users; -- 結果: 'User ID: 1, Name: John Doe' SELECT CONCAT('Hello', NULL, 'World'); -- 結果: NULL (因為有一個參數是NULL)
-
CONCAT_WS(separator, str1, str2, ...)
WS 是 With Separator 的縮寫。這個函數用一個指定的分隔符將多個字符串連接起來。它最大的優點是會自動忽略 NULL 值,而不會導致整個結果變為 NULL。
SELECT CONCAT_WS(' ', 'Hello', 'World') AS greeting; -- 結果: 'Hello World' (效果和CONCAT一樣) SELECT CONCAT_WS(', ', last_name, first_name) AS full_name FROM users; -- 結果: 'Doe, John' SELECT CONCAT_WS('-', '2023', NULL, '10') AS date_str; -- 結果: '2023-10' (NULL值被忽略,分隔符仍然存在) -- 如果用 CONCAT('2023', NULL, '10') 結果會是 NULL SELECT CONCAT_WS(NULL, 'Hello', 'World'); -- 結果: NULL (因為分隔符是NULL)
處理 NULL 值:使用 IFNULL() 或 COALESCE()
為了避免 CONCAT 因為 NULL 值而返回 NULL,可以先用函數將 NULL 轉換成一個空字符串 '' 或其他默認值。
IFNULL(expr1, replacement_value):如果 expr1 不是 NULL,則返回 expr1;否則返回 replacement_value。
COALESCE(value1, value2, ...):返回參數列表中第一個非 NULL 的值。
假設 middle_name 字段可能為 NULL。
-- 如果middle_name為NULL,就用空字符串代替 SELECT CONCAT( first_name, ' ', IFNULL(middle_name, ''), ' ', last_name ) AS full_name FROM users; -- 使用 COALESCE 實現同樣效果 SELECT CONCAT( first_name, ' ', COALESCE(middle_name, ''), ' ', last_name ) AS full_name FROM users;
這個函數用于將分組后多行記錄的某個字段值,拼接成一個字符串。通常與 GROUP BY 子句一起使用。
GROUP_CONCAT([DISTINCT] column_name [ORDER BY ...] [SEPARATOR 'sep'])
SEPARATOR: 指定分隔符,默認為逗號 ,。
假設有一個 orders 表,一個用戶 (user_id) 可能有多個訂單 (order_id)。
-- 查詢每個用戶的所有訂單號,合并成一個用逗號分隔的字符串 SELECT user_id, GROUP_CONCAT(order_id) AS all_orders FROM orders GROUP BY user_id; -- 結果可能如下: -- user_id | all_orders -- 1 | 1001,1005,1009 -- 2 | 1002,1004 -- 去重并使用不同的分隔符 SELECT user_id, GROUP_CONCAT(DISTINCT product_name ORDER BY product_name SEPARATOR ' | ') AS products FROM order_details GROUP BY user_id; -- 結果: product_a | product_b | product_c
| 函數 | 用途 | 對 NULL 的處理 | 適用場景 |
| CONCAT() | 連接多個字符串 | 遇到 NULL 則返回 NULL | 通用的字符串拼接,需注意處理NULL |
| CONCAT_WS() | 用分隔符連接字符串 | 自動忽略 NULL | 用統一分隔符拼接字段(如地址、全名),首選 |
| GROUP_CONCAT() | 將分組的多行值連接成一行 | 忽略該行(如果該字段為NULL) | 與 GROUP BY 一起使用,進行行轉列聚合查詢 |
日常拼接,特別是字段之間需要加分隔符(如空格、逗號)時,優先使用 CONCAT_WS(),因為它更安全、簡潔。
如果確定所有參數都不為 NULL,或者需要 NULL 導致整個結果為 NULL 的邏輯,可以使用 CONCAT()。
需要進行多行合并時,毫不猶豫地使用 GROUP_CONCAT()。
另外搭配便捷的MYSQL備份工具,可定時備份、異地備份,MYSQL導出導入?杀镜剡B接LINUX里的MYSQL,簡單便捷。可以大大地提高工作效率喔。