首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle SUBSTR 字串截取函數完整指南:語法、參數陷阱與實戰範例

     編輯:Oracle 資料庫基礎

函數語法

SUBSTR(string, start_position [, length ])

參數說明

  • string:來源字串
  • start_position:起始位置 從 1 開始計算(非 0),負數表示從尾部倒數
  • length:截取長度(可選),省略則截取至字串末尾
重要:Oracle SUBSTR 起始位置以 1 為基底,這與多數程式語言(C、Java、Python 以 0 為基底)不同,極易踩坑。

核心範例

SUBSTR('ABCDEFG', 1)SUBSTR('ABCDEFG', 3)SUBSTR('ABCDEFG', 1, 3)SUBSTR('ABCDEFG', -3)SUBSTR('ABCDEFG', -5, 2)SUBSTR('ABCDEFG', 1, 100)
呼叫結果說明
ABCDEFG從第 1 字元截取至結尾
CDEFG從第 3 字元 (C) 截取至結尾
ABC從第 1 字元截取 3 個字元
EFG倒數第 3 字元 (E) 至結尾
CD倒數第 5 字元 (C) 開始截取 2 個
ABCDEFG長度超出不報錯,實際截取至結尾

常見變體函數

  • SUBSTRB:以 位元組 為單位計算位置/長度(適用多位元組字符集)
  • SUBSTRC:以 完整 Unicode 字元 為單位(補充字元處理)
  • SUBSTR2:以 UCS-2 代碼單元 為單位
  • SUBSTR4:以 UCS-4 代碼點 為單位

實戰應用場景

1. 固定寬度欄位解析(如 ETL 匯入)

SELECT SUBSTR(record, 1, 10)   AS id,
       SUBSTR(record, 11, 20)  AS name,
       SUBSTR(record, 31, 8)   AS birth_date,
       SUBSTR(record, 39)      AS address
FROM staging_table;

2. 遮罩敏感資料(手機、身分證)

SELECT 'XXX-XXX-' || SUBSTR(phone, -4) AS masked_phone,
       SUBSTR(id_no, 1, 1) || '********' || SUBSTR(id_no, -1) AS masked_id
FROM customers;

3. 搭配 INSTR 進行動態截取

-- 取得 @ 之前的部份 (Email 帳號)
SELECT SUBSTR(email, 1, INSTR(email, '@') - 1) AS account
FROM users;

-- 取得最後一個 / 之後的檔名
SELECT SUBSTR(path, INSTR(path, '/', -1) + 1) AS filename
FROM file_logs;

4. 分頁顯示長文本摘要

SELECT CASE 
         WHEN LENGTH(content) > 200 
         THEN SUBSTR(content, 1, 200) || '...'
         ELSE content
       END AS summary
FROM articles;

效能提示

  • SUBSTR 為內建函數,極度優化,無顯著效能負擔
  • 避免在 WHERE 條件對大欄位使用 SUBSTR 導致全表掃描,考慮函數索引:CREATE INDEX idx_substr ON t(SUBSTR(col,1,10))
  • 大量資料處理時,PL/SQL 批次處理優於逐筆 SQL

相關函數速查

掌握 SUBSTR 的 1-based 索引特性與負數倒數邏輯,配合 INSTR 動態定位,能解決 90% 的字串截取需求。記住:Oracle 字串位置從 1 開始,這是從其他語言轉來開發者最常見的 Bug 來源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數用途
INSTR尋找子字串位置
LENGTH / LENGTHB字串長度 (字元/位元組)
REPLACE字串替換
TRIM / LTRIM / RTRIM去除首尾空白或指定字元
LPAD / RPAD左/右填充至指定長度