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_idphone
102-12345678
203-87654321

範例:擷取電話區碼和號碼

SELECT
    customer_id,
    LEFT(phone, 2) AS area_code,
    RIGHT(phone, 8) AS phone_number
FROM customers;

結果:

customer_idarea_codephone_number
10212345678
20387654321

實際應用範例

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-
OracleSUBSTR()

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);    -- 結果:''

相關主題