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

Oracle SUBSTR 函數參數詳解:起始位置從 1 開始的關鍵差異與實戰陷阱

     編輯:Oracle 教學

Oracle SUBSTR 函數參數詳解:起始位置從 1 開始的關鍵差異與實戰陷阱

一、標準語法定義

SUBSTR(string, start_position [, length])
參數說明關鍵特性
string源字符串支持 CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB、NCLOB
start_position起始位置從 1 開始計數;負數表示從末尾倒數(-1 為最後一字符)
length截取長度可選;省略則截取至字符串末尾;負數報錯 ORA-01476

二、核心行為矩陣

-- 基準字符串:'ABCDEFG' (長度 7)
SELECT 
  SUBSTR('ABCDEFG', 1, 3)   AS pos1_len3,   -- 'ABC'   正向從首字符取3位
  SUBSTR('ABCDEFG', 3, 2)   AS pos3_len2,   -- 'CD'    正向從第3字符取2位
  SUBSTR('ABCDEFG', -3, 2)  AS neg3_len2,   -- 'EF'    反向從倒數第3字符取2位
  SUBSTR('ABCDEFG', -1)     AS neg1_omit,   -- 'G'     反向從最後1字符取至末尾
  SUBSTR('ABCDEFG', 0, 2)   AS zero_len2,   -- 'AB'    0 視同 1(Oracle 兼容性行為)
  SUBSTR('ABCDEFG', 5)      AS pos5_omit    -- 'EFG'   從第5字符取至末尾
FROM dual;

三、與編程語言的關鍵差異對比

語言/函數起始索引負數索引含義長度參數
Oracle SUBSTR1從末尾倒數可選,省略至末尾
Python 切片 [start:end]0從末尾倒數end 為結束位置(不含)
Java substring(begin, end)0不支持end 為結束位置(不含)
C# Substring(start, length)0不支持長度,可選
JavaScript substr(start, length)0從末尾倒數長度,可選

遷移陷阱警示:從 0 基索引語言遷移 SQL 時,start_position 必須 +1,否則會導致首字符丟失或越界。

四、實戰高頻場景模板

1. 截取最後 N 字符

SUBSTR(col, -5)  -- 最後 5 字符

2. 去除首尾固定長度前綴/後綴

-- 去除前 3 字符(如 'PRE_')
SUBSTR(col, 4)

-- 去除後 4 字符(如 '_SUF')
SUBSTR(col, 1, LENGTH(col) - 4)

3. 定長字段解析(如定長文件導入)

-- 假設記錄格式:ID(6) | NAME(20) | AMT(10) | DATE(8)
SELECT 
  SUBSTR(record, 1, 6)    AS id,
  SUBSTR(record, 7, 20)   AS name,
  SUBSTR(record, 27, 10)  AS amt,
  SUBSTR(record, 37, 8)   AS dt
FROM staging_table;

4. 配合 INSTR 實現分隔符分割

-- 取 'a|bb|ccc' 中第 2 段('bb')
SELECT SUBSTR(
  'a|bb|ccc',
  INSTR('a|bb|ccc', '|', 1, 1) + 1,
  INSTR('a|bb|ccc', '|', 1, 2) - INSTR('a|bb|ccc', '|', 1, 1) - 1
) FROM dual;

五、性能優化提示

  • 避免在 WHERE 條件對大表列使用 SUBSTR:導致全表掃描,改用虛擬列 + 索引或函數索引
  • SUBSTR(col, 1, 1) = 'X' → col LIKE 'X%'(可用索引)
  • PL/SQL 批量處理時,考慮 BULK COLLECT 減少上下文切換

記住鐵律:Oracle 字符串定位永遠從 1 開始,這是所有字符串函數(INSTR、LENGTH、REPLACE 等)的統一約定,與絕大多數編程語言截然不同。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved