SQL 字串函數介紹 (SQL String Functions)
這篇 SQL 字串函數教學將帶你認識 SQL 中最常用的字串處理函數,包括 CONCAT、SUBSTRING、TRIM、REPLACE、UPPER、LOWER 與 LENGTH。這些函數能幫助你在查詢時對文字資料進行串接、擷取、去除空白、替換、大小寫轉換等操作。
在實際開發中,資料庫儲存的文字資料經常需要進行格式處理,例如去除前後空白、統一大小寫、拼接姓名欄位等。熟練運用字串函數可以讓你的 SQL 查詢更加靈活,也能有效提升資料處理的效率。
以下範例將使用這張 employees 資料表來示範:
| EmployeeID | FirstName | LastName | Department | |
|---|---|---|---|---|
| 1 | 小明 | 王 | ming.wang@example.com | Sales |
| 2 | 小華 | 李 | hua.li@EXAMPLE.COM | Marketing |
| 3 | 小美 | 陳 | mei.chen@example.com | Sales |
| 4 | 小強 | 林 | qiang.lin@Example.Com | Engineering |
| 5 | 小芳 | 黃 | fang.huang@example.com | Marketing |
CONCAT 字串串接 (SQL CONCAT Function)
CONCAT 函數用來將兩個或多個字串串接在一起。在實務上經常用於合併姓名、拼接地址等情境。
CONCAT 語法 (Syntax)
CONCAT(string1, string2, ...)
-- 或使用 || 運算子(部分資料庫支援)
string1 || string2
CONCAT 用法範例 (Example)
將 LastName 與 FirstName 合併為完整姓名:
SELECT CONCAT(LastName, FirstName) AS FullName
FROM employees;
執行結果:
| FullName |
|---|
| 王小明 |
| 李小華 |
| 陳小美 |
| 林小強 |
| 黃小芳 |
如果想在姓名中間加入分隔符號,可以在 CONCAT 中加入字串:
SELECT CONCAT(LastName, ' ', FirstName) AS FullName
FROM employees;
執行結果:
| FullName |
|---|
| 王 小明 |
| 李 小華 |
| 陳 小美 |
| 林 小強 |
| 黃 小芳 |
SUBSTRING 字串擷取 (SQL SUBSTRING Function)
SUBSTRING 函數用來從字串中擷取指定位置和長度的子字串。不同資料庫可能使用不同的函數名稱,例如 MySQL 也支援 SUBSTR。
SUBSTRING 語法 (Syntax)
SUBSTRING(string, start, length)
-- MySQL 也可以寫成
SUBSTR(string, start, length)
其中 start 是起始位置(從 1 開始計算),length 是要擷取的字元數。
SUBSTRING 用法範例 (Example)
從 Email 欄位中擷取 @ 符號前的使用者名稱(取前 3 個字元):
SELECT Email, SUBSTRING(Email, 1, 3) AS EmailPrefix
FROM employees;
執行結果:
| EmailPrefix | |
|---|---|
| ming.wang@example.com | min |
| hua.li@EXAMPLE.COM | hua |
| mei.chen@example.com | mei |
| qiang.lin@Example.Com | qia |
| fang.huang@example.com | fan |
TRIM 去除空白 (SQL TRIM Function)
TRIM 函數用來去除字串前後的空白字元(或指定字元)。在資料清理時非常實用,因為使用者輸入的資料很容易包含多餘的空白。除了 TRIM 之外,還有 LTRIM(去除左側空白)和 RTRIM(去除右側空白)。
TRIM 語法 (Syntax)
TRIM(string)
LTRIM(string)
RTRIM(string)
-- 去除指定字元(部分資料庫支援)
TRIM(BOTH 'x' FROM string)
TRIM(LEADING 'x' FROM string)
TRIM(TRAILING 'x' FROM string)
TRIM 用法範例 (Example)
去除 FirstName 欄位前後的空白:
SELECT FirstName, TRIM(FirstName) AS TrimmedName
FROM employees;
執行結果:
| FirstName | TrimmedName |
|---|---|
| 小明 | 小明 |
| 小華 | 小華 |
| 小美 | 小美 |
| 小強 | 小強 |
| 小芳 | 小芳 |
可以看到原本 FirstName 欄位中包含的前後空白都已被清除。
REPLACE 字串替換 (SQL REPLACE Function)
REPLACE 函數用來將字串中指定的子字串替換為另一個字串。常用於資料清理、統一格式或後置處理場景。
REPLACE 語法 (Syntax)
REPLACE(string, old_substring, new_substring)
REPLACE 用法範例 (Example)
將 Email 中的網域從 example.com 替換為 company.com:
SELECT Email, REPLACE(Email, 'example.com', 'company.com') AS NewEmail
FROM employees;
執行結果:
| NewEmail | |
|---|---|
| ming.wang@example.com | ming.wang@company.com |
| hua.li@EXAMPLE.COM | hua.li@EXAMPLE.COM |
| mei.chen@example.com | mei.chen@company.com |
| qiang.lin@Example.Com | qiang.lin@Example.Com |
| fang.huang@example.com | fang.huang@company.com |
請注意 REPLACE 是區分大小寫的,所以 EXAMPLE.COM 和 Example.Com 並沒有被替換。如果需要不區分大小寫進行替換,可以搭配 LOWER 或 UPPER 一起使用。
UPPER 與 LOWER 大小寫轉換 (SQL UPPER / LOWER Function)
UPPER 將字串轉換為大寫,LOWER 將字串轉換為小寫。這兩個函數在需要統一資料格式或進行不區分大小寫的比對時非常實用。
UPPER / LOWER 語法 (Syntax)
UPPER(string)
LOWER(string)
-- MySQL 也支援
UCASE(string)
LCASE(string)
UPPER / LOWER 用法範例 (Example)
將 Email 欄位全部轉為小寫:
SELECT Email, LOWER(Email) AS LowerEmail
FROM employees;
執行結果:
| LowerEmail | |
|---|---|
| ming.wang@example.com | ming.wang@example.com |
| hua.li@EXAMPLE.COM | hua.li@example.com |
| mei.chen@example.com | mei.chen@example.com |
| qiang.lin@Example.Com | qiang.lin@example.com |
| fang.huang@example.com | fang.huang@example.com |
將 Department 欄位全部轉為大寫:
SELECT Department, UPPER(Department) AS UpperDept
FROM employees;
執行結果:
| Department | UpperDept |
|---|---|
| Sales | SALES |
| Marketing | MARKETING |
| Sales | SALES |
| Engineering | ENGINEERING |
| Marketing | MARKETING |
LENGTH 字串長度 (SQL LENGTH Function)
LENGTH 函數用來取得字串的長度(字元數)。在 SQL Server 中對應的函數為 LEN,Oracle 也支援 LENGTH。
LENGTH 語法 (Syntax)
LENGTH(string) -- MySQL, PostgreSQL, Oracle
LEN(string) -- SQL Server
CHAR_LENGTH(string) -- 標準 SQL
LENGTH 用法範例 (Example)
查詢每位員工的 Email 長度:
SELECT Email, LENGTH(Email) AS EmailLength
FROM employees;
執行結果:
| EmailLength | |
|---|---|
| ming.wang@example.com | 21 |
| hua.li@EXAMPLE.COM | 18 |
| mei.chen@example.com | 20 |
| qiang.lin@Example.Com | 21 |
| fang.huang@example.com | 22 |
字串函數綜合比較
以下表格整理了本文介紹的各個字串函數及其功能:
| 函數 | 功能說明 | 範例 |
|---|---|---|
| CONCAT | 字串串接 | CONCAT(‘A’, ‘B’) → ‘AB’ |
| SUBSTRING | 擷取子字串 | SUBSTRING(‘Hello’, 1, 3) → ‘Hel’ |
| TRIM | 去除前後空白 | TRIM(‘ Hi ‘) → ‘Hi’ |
| REPLACE | 字串替換 | REPLACE(‘abc’, ‘b’, ‘x’) → ‘axc’ |
| UPPER | 轉換為大寫 | UPPER(‘hello’) → ‘HELLO’ |
| LOWER | 轉換為小寫 | LOWER(‘HELLO’) → ‘hello’ |
| LENGTH | 取得字串長度 | LENGTH(‘Hello’) → 5 |
各資料庫字串函數對照
不同資料庫系統對字串函數的支援稍有差異,以下是常見的對照表:
| 功能 | MySQL | PostgreSQL | SQL Server | Oracle |
|---|---|---|---|---|
| 字串串接 | CONCAT / || | CONCAT / || | CONCAT / + | CONCAT / || |
| 擷取子字串 | SUBSTRING / SUBSTR | SUBSTRING | SUBSTRING | SUBSTR |
| 去除空白 | TRIM / LTRIM / RTRIM | TRIM / LTRIM / RTRIM | TRIM / LTRIM / RTRIM | TRIM / LTRIM / RTRIM |
| 字串替換 | REPLACE | REPLACE | REPLACE | REPLACE |
| 轉大寫 | UPPER / UCASE | UPPER | UPPER | UPPER |
| 轉小寫 | LOWER / LCASE | LOWER | LOWER | LOWER |
| 字串長度 | LENGTH / CHAR_LENGTH | LENGTH | LEN | LENGTH |
延伸閱讀
- SQL 教學 — 完整教學導覽
- SQL SELECT — 資料查詢語法
- SQL WHERE — 條件查詢教學
- SQL LIKE — 模糊查詢教學
- SQL 聚合函數 — COUNT、SUM、AVG、MIN、MAX
- SQL CASE — 條件判斷教學
- SQL NULL 值處理 — IS NULL、COALESCE、IFNULL
- SQL Date — 日期函數教學