CONCAT() 函數 (SQL CONCAT() Function)

CONCAT() 函數用於連接 (合併) 多個字串成為一個字串。這是 SQL 中最常用的字串處理函數之一。

CONCAT() 語法 (Syntax)

CONCAT(string1, string2, ...)

不同資料庫的字串連接語法

由於各資料庫的實作略有不同,以下整理各資料庫的字串連接方式:

資料庫CONCAT() 函數運算子
MySQLCONCAT(str1, str2, ...)-
SQL ServerCONCAT(str1, str2, ...) (2012+)+
PostgreSQLCONCAT(str1, str2, ...)`
OracleCONCAT(str1, str2) (只接受 2 個參數)`
SQLite-`

CONCAT() 用法範例 (Example)

customers 資料表:

C_IdFirstNameLastName
1JohnSmith
2MaryBrad

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;

效能考量

頻繁的字串連接操作可能會影響效能。對於大量資料,考慮:

  1. 在應用程式層進行字串處理
  2. 使用計算欄位或視圖預先處理
  3. 避免在 WHERE 子句中進行複雜的字串連接

相關主題