SQL 字串函數

SQL 字串函數介紹 (SQL String Functions)

這篇 SQL 字串函數教學將帶你認識 SQL 中最常用的字串處理函數,包括 CONCAT、SUBSTRING、TRIM、REPLACE、UPPER、LOWER 與 LENGTH。這些函數能幫助你在查詢時對文字資料進行串接、擷取、去除空白、替換、大小寫轉換等操作。

在實際開發中,資料庫儲存的文字資料經常需要進行格式處理,例如去除前後空白、統一大小寫、拼接姓名欄位等。熟練運用字串函數可以讓你的 SQL 查詢更加靈活,也能有效提升資料處理的效率。

以下範例將使用這張 employees 資料表來示範:

EmployeeIDFirstNameLastNameEmailDepartment
1 小明 ming.wang@example.comSales
2小華hua.li@EXAMPLE.COMMarketing
3 小美mei.chen@example.comSales
4小強qiang.lin@Example.ComEngineering
5小芳 fang.huang@example.comMarketing

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;

執行結果:

EmailEmailPrefix
ming.wang@example.commin
hua.li@EXAMPLE.COMhua
mei.chen@example.commei
qiang.lin@Example.Comqia
fang.huang@example.comfan

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;

執行結果:

FirstNameTrimmedName
  小明  小明
小華小華
  小美小美
小強小強
小芳  小芳

可以看到原本 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;

執行結果:

EmailNewEmail
ming.wang@example.comming.wang@company.com
hua.li@EXAMPLE.COMhua.li@EXAMPLE.COM
mei.chen@example.commei.chen@company.com
qiang.lin@Example.Comqiang.lin@Example.Com
fang.huang@example.comfang.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;

執行結果:

EmailLowerEmail
ming.wang@example.comming.wang@example.com
hua.li@EXAMPLE.COMhua.li@example.com
mei.chen@example.commei.chen@example.com
qiang.lin@Example.Comqiang.lin@example.com
fang.huang@example.comfang.huang@example.com

將 Department 欄位全部轉為大寫:

SELECT Department, UPPER(Department) AS UpperDept
FROM employees;

執行結果:

DepartmentUpperDept
SalesSALES
MarketingMARKETING
SalesSALES
EngineeringENGINEERING
MarketingMARKETING

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;

執行結果:

EmailEmailLength
ming.wang@example.com21
hua.li@EXAMPLE.COM18
mei.chen@example.com20
qiang.lin@Example.Com21
fang.huang@example.com22

字串函數綜合比較

以下表格整理了本文介紹的各個字串函數及其功能:

函數功能說明範例
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

各資料庫字串函數對照

不同資料庫系統對字串函數的支援稍有差異,以下是常見的對照表:

功能MySQLPostgreSQLSQL ServerOracle
字串串接CONCAT / ||CONCAT / ||CONCAT / +CONCAT / ||
擷取子字串SUBSTRING / SUBSTRSUBSTRINGSUBSTRINGSUBSTR
去除空白TRIM / LTRIM / RTRIMTRIM / LTRIM / RTRIMTRIM / LTRIM / RTRIMTRIM / LTRIM / RTRIM
字串替換REPLACEREPLACEREPLACEREPLACE
轉大寫UPPER / UCASEUPPERUPPERUPPER
轉小寫LOWER / LCASELOWERLOWERLOWER
字串長度LENGTH / CHAR_LENGTHLENGTHLENLENGTH

延伸閱讀