CONCAT() 函數 (SQL CONCAT() Function)
CONCAT() 函數用於連接 (合併) 多個字串成為一個字串。這是 SQL 中最常用的字串處理函數之一。
CONCAT() 語法 (Syntax)
CONCAT(string1, string2, ...)
不同資料庫的字串連接語法
由於各資料庫的實作略有不同,以下整理各資料庫的字串連接方式:
| 資料庫 | CONCAT() 函數 | 運算子 |
|---|---|---|
| MySQL | CONCAT(str1, str2, ...) | - |
| SQL Server | CONCAT(str1, str2, ...) (2012+) | + |
| PostgreSQL | CONCAT(str1, str2, ...) | ` |
| Oracle | CONCAT(str1, str2) (只接受 2 個參數) | ` |
| SQLite | - | ` |
CONCAT() 用法範例 (Example)
customers 資料表:
| C_Id | FirstName | LastName |
|---|---|---|
| 1 | John | Smith |
| 2 | Mary | Brad |
MySQL / PostgreSQL / SQL Server (2012+)
SELECT CONCAT(FirstName, ' ', LastName) AS FullName
FROM customers;
結果:
| FullName |
|---|
| John Smith |
| Mary Brad |
SQL Server (使用 + 運算子)
SELECT FirstName + ' ' + LastName AS FullName
FROM customers;
Oracle / PostgreSQL / SQLite (使用 || 運算子)
SELECT FirstName || ' ' || LastName AS FullName
FROM customers;
Oracle (CONCAT 只接受兩個參數)
-- Oracle 的 CONCAT() 只能接受兩個參數
SELECT CONCAT(CONCAT(FirstName, ' '), LastName) AS FullName
FROM customers;
-- 或使用 || 運算子 (推薦)
SELECT FirstName || ' ' || LastName AS FullName
FROM customers;
CONCAT() 與 NULL 值
不同資料庫對 NULL 值的處理方式不同:
MySQL
MySQL 的 CONCAT() 如果任一參數為 NULL,整個結果會是 NULL:
SELECT CONCAT('Hello', NULL, 'World');
-- 結果:NULL
使用 CONCAT_WS() 或 IFNULL() 來處理 NULL:
-- 使用 IFNULL 將 NULL 轉為空字串
SELECT CONCAT(IFNULL(FirstName, ''), ' ', IFNULL(LastName, ''))
FROM customers;
SQL Server
SQL Server 的 CONCAT() 會將 NULL 視為空字串:
SELECT CONCAT('Hello', NULL, 'World');
-- 結果:HelloWorld
但使用 + 運算子時,NULL 會導致整個結果為 NULL:
SELECT 'Hello' + NULL + 'World';
-- 結果:NULL
CONCAT_WS() - 帶分隔符號的連接
MySQL 和 SQL Server (2017+) 提供 CONCAT_WS() (With Separator),可以指定分隔符號:
-- CONCAT_WS(separator, str1, str2, ...)
SELECT CONCAT_WS('-', '2024', '01', '15') AS Date;
-- 結果:2024-01-15
SELECT CONCAT_WS(', ', City, Country) AS Location
FROM customers;
CONCAT_WS() 會自動忽略 NULL 值:
SELECT CONCAT_WS('-', 'A', NULL, 'B', 'C');
-- 結果:A-B-C
實際應用範例
1. 組合完整地址
SELECT CONCAT(Address, ', ', City, ', ', Country) AS FullAddress
FROM customers;
2. 產生唯一識別碼
SELECT CONCAT('ORD-', YEAR(OrderDate), '-', O_Id) AS OrderCode
FROM orders;
-- 結果範例:ORD-2024-001
3. 動態產生 SQL 語句
SELECT CONCAT('UPDATE products SET Price = ', Price * 1.1, ' WHERE P_Id = ', P_Id) AS UpdateSQL
FROM products;
4. 組合搜尋用的全文欄位
SELECT CONCAT(Name, ' ', Description, ' ', Category) AS SearchText
FROM products;
效能考量
頻繁的字串連接操作可能會影響效能。對於大量資料,考慮:
- 在應用程式層進行字串處理
- 使用計算欄位或視圖預先處理
- 避免在
WHERE子句中進行複雜的字串連接
相關主題
- LENGTH() - 取得字串長度
- SUBSTRING() - 擷取子字串
- REPLACE() - 取代字串
- GROUP_CONCAT() - 群組字串連接