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_codename
PRD-001-TW筆記型電腦
PRD-002-US智慧手機

擷取產品代碼的前三個字元:

SELECT SUBSTRING(product_code, 1, 3) AS prefix, name
FROM products;

結果:

prefixname
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;

各資料庫差異

資料庫函數名稱負數起始位置
MySQLSUBSTRING(), SUBSTR()支援(從後面數)
SQL ServerSUBSTRING()不支援
OracleSUBSTR()支援(從後面數)
PostgreSQLSUBSTRING(), 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;