LEFT() / RIGHT() 函數 (SQL LEFT/RIGHT Function)
LEFT() 函數用於取得字串左側 (開頭) 指定數量的字元,RIGHT() 函數則是取得右側 (結尾) 的字元。這兩個函數是 SUBSTRING() 的簡化版本。
語法 (Syntax)
LEFT(string, number_of_chars)
RIGHT(string, number_of_chars)
string:原始字串或欄位名稱number_of_chars:要擷取的字元數
基本範例
SELECT LEFT('Hello World', 5) AS LeftResult;
-- 結果:'Hello'
SELECT RIGHT('Hello World', 5) AS RightResult;
-- 結果:'World'
SELECT LEFT('ABC123', 3) AS Letters;
-- 結果:'ABC'
SELECT RIGHT('ABC123', 3) AS Numbers;
-- 結果:'123'
從資料表欄位擷取
customers 資料表:
| customer_id | phone |
|---|---|
| 1 | 02-12345678 |
| 2 | 03-87654321 |
範例:擷取電話區碼和號碼
SELECT
customer_id,
LEFT(phone, 2) AS area_code,
RIGHT(phone, 8) AS phone_number
FROM customers;
結果:
| customer_id | area_code | phone_number |
|---|---|---|
| 1 | 02 | 12345678 |
| 2 | 03 | 87654321 |
實際應用範例
1. 擷取日期部分
-- 從 'YYYY-MM-DD' 格式擷取年份和日期
SELECT
order_date,
LEFT(order_date, 4) AS year,
RIGHT(order_date, 2) AS day
FROM orders;
2. 取得檔案副檔名
-- 假設檔名格式為 filename.ext
SELECT
filename,
RIGHT(filename, 3) AS extension
FROM files
WHERE RIGHT(filename, 3) IN ('jpg', 'png', 'gif');
3. 資料脫敏
-- 只顯示姓名的第一個字
SELECT
CONCAT(LEFT(name, 1), '**') AS masked_name
FROM customers;
-- 結果:'張**'
-- 只顯示 email 的前後部分
SELECT
CONCAT(LEFT(email, 3), '***', RIGHT(email, 10)) AS masked_email
FROM users;
-- 結果:'joh***@gmail.com'
4. 產品代碼解析
-- 產品代碼格式:'PRD-001-TW'
SELECT
product_code,
LEFT(product_code, 3) AS prefix,
RIGHT(product_code, 2) AS country
FROM products;
5. 搭配 CHARINDEX / LOCATE
-- 取得 email 中 @ 之前的使用者名稱
-- SQL Server
SELECT LEFT(email, CHARINDEX('@', email) - 1) AS username
FROM users;
-- MySQL
SELECT LEFT(email, LOCATE('@', email) - 1) AS username
FROM users;
各資料庫支援
| 資料庫 | LEFT() | RIGHT() | 替代方案 |
|---|---|---|---|
| MySQL | ✅ | ✅ | - |
| SQL Server | ✅ | ✅ | - |
| PostgreSQL | ✅ | ✅ | - |
| SQLite | ✅ | ✅ | - |
| Oracle | ❌ | ❌ | SUBSTR() |
Oracle 替代方案
Oracle 沒有 LEFT() 和 RIGHT() 函數,需要使用 SUBSTR():
-- LEFT(string, n) 的替代
SELECT SUBSTR('Hello World', 1, 5) FROM DUAL;
-- 結果:'Hello'
-- RIGHT(string, n) 的替代 (使用負數)
SELECT SUBSTR('Hello World', -5) FROM DUAL;
-- 結果:'World'
-- 或使用 LENGTH()
SELECT SUBSTR('Hello World', LENGTH('Hello World') - 4, 5) FROM DUAL;
-- 結果:'World'
LEFT() / RIGHT() 與 SUBSTRING() 的關係
-- LEFT(str, n) 等同於
SUBSTRING(str, 1, n)
-- RIGHT(str, n) 等同於
SUBSTRING(str, LENGTH(str) - n + 1, n) -- SQL Server
SUBSTRING(str, -n) -- MySQL (支援負數)
處理 NULL 和空字串
SELECT LEFT(NULL, 5); -- 結果:NULL
SELECT LEFT('', 5); -- 結果:''
SELECT LEFT('ABC', 10); -- 結果:'ABC' (不會出錯)
SELECT LEFT('ABC', 0); -- 結果:''
相關主題
- SUBSTRING() - 通用子字串函數
- MID() - MySQL 專用子字串函數
- LENGTH() - 取得字串長度
- CHARINDEX() / INSTR() - 搜尋字元位置