SUBSTRING() 函數 (SQL SUBSTRING() Function)
SUBSTRING()(或 SUBSTR())函數用來從字串中擷取指定位置、指定長度的子字串。
語法
-- 標準 SQL / SQL Server / PostgreSQL
SUBSTRING(string, start, length)
SUBSTRING(string FROM start FOR length)
-- MySQL
SUBSTRING(string, start, length)
SUBSTR(string, start, length)
-- Oracle
SUBSTR(string, start, length)
- string:原始字串或欄位名稱
- start:起始位置(從 1 開始計算)
- length:要擷取的字元數(選填,省略則擷取到字串結尾)
基本範例
SELECT SUBSTRING('Hello World', 1, 5);
-- 結果: Hello
SELECT SUBSTRING('Hello World', 7, 5);
-- 結果: World
SELECT SUBSTRING('Hello World', 7);
-- 結果: World(擷取到結尾)
從資料表欄位擷取
假設有一個 products 資料表:
| product_code | name |
|---|---|
| PRD-001-TW | 筆記型電腦 |
| PRD-002-US | 智慧手機 |
擷取產品代碼的前三個字元:
SELECT SUBSTRING(product_code, 1, 3) AS prefix, name
FROM products;
結果:
| prefix | name |
|---|---|
| PRD | 筆記型電腦 |
| PRD | 智慧手機 |
擷取國家代碼(最後兩個字元):
-- MySQL / Oracle(使用負數表示從後面數)
SELECT SUBSTR(product_code, -2) AS country FROM products;
-- SQL Server(需搭配 LEN 函數)
SELECT SUBSTRING(product_code, LEN(product_code) - 1, 2) AS country FROM products;
各資料庫差異
| 資料庫 | 函數名稱 | 負數起始位置 |
|---|---|---|
| MySQL | SUBSTRING(), SUBSTR() | 支援(從後面數) |
| SQL Server | SUBSTRING() | 不支援 |
| Oracle | SUBSTR() | 支援(從後面數) |
| PostgreSQL | SUBSTRING(), SUBSTR() | 不支援 |
搭配其他函數使用
搭配 CHARINDEX 取得特定位置後的字串:
-- 取得 email 中 @ 之後的網域
-- SQL Server
SELECT SUBSTRING(email, CHARINDEX('@', email) + 1, 100) AS domain
FROM users;
-- MySQL
SELECT SUBSTRING(email, LOCATE('@', email) + 1) AS domain
FROM users;