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

SQL 字串擷取函數 SUBSTR/SUBSTRING 跨資料庫差異速查:MySQL、Oracle、SQL Server、PostgreSQL

     編輯:關於SqlServer

核心差異:函數名稱與參數順序不一

各大資料庫對「字串子集擷取」的函數命名、參數語意略有不同,開發跨平台 SQL 時極易踩坑。

三大主流資料庫語法對照表

資料庫函數名稱語法起始位置基數備註
MySQLSUBSTR() / SUBSTRING()SUBSTR(str, pos[, len])1-based支援負數位置(從右往左數)
OracleSUBSTR()SUBSTR(str, pos[, len])1-based負數位置 = 從末尾往前;len 可省略(截到尾)
SQL ServerSUBSTRING()SUBSTRING(expression, start, length)1-basedlength 必填;不支援負數 start
PostgreSQLSUBSTRING() / SUBSTR()SUBSTRING(str FROM pos [FOR len]) 或 SUBSTR(str, pos[, len])1-based支援標準 SQL FROM ... FOR 語法

常用呼叫模式範例

1. 從第 N 字元截取到結尾


-- MySQL / Oracle / PostgreSQL
SUBSTR('abcdef', 3)        -- 回傳 'cdef'
SUBSTRING('abcdef' FROM 3) -- PostgreSQL 標準寫法

-- SQL Server (必須給 length,可用大數值或 LEN)
SUBSTRING('abcdef', 3, 100) -- 回傳 'cdef'

2. 從第 N 字元截取 M 字元


-- 通用寫法 (MySQL/Oracle/PostgreSQL/SQL Server 皆支援)
SUBSTR('abcdef', 2, 3)   -- 回傳 'bcd'
SUBSTRING('abcdef', 2, 3) -- SQL Server / 標準

3. 負數位置(從右往左):MySQL/Oracle/PostgreSQL 專屬


SUBSTR('abcdef', -3)     -- 回傳 'def' (最後 3 字元)
SUBSTR('abcdef', -4, 2)  -- 回傳 'cd' (倒數第 4 字元起 2 碼)
-- SQL Server 不支援,需用 LEN 計算:
SUBSTRING('abcdef', LEN('abcdef') - 3 + 1, 3) -- 'def'

避坑指南:開發者必知的 5 大差異

  1. SQL Server 必須指定 length,不可省略;其他三者可省略表示「截到尾」。
  2. 起始位置皆為 1-based(第一個字元位置 = 1),非程式語言常見的 0-based。
  3. 負數位置僅 MySQL/Oracle/PostgreSQL 支援,SQL Server 需自行換算。
  4. 參數順序一致:(字串, 起始位置, 長度),但 PostgreSQL 另提供 FROM ... FOR 關鍵字語法。
  5. 資料型別隱含轉換:數值、日期傳入時會隱含轉字串,結果可能因格式設定而異,建議明確 CAST/CONVERT。

跨資料庫相容寫法建議

  • 使用 ORM/查詢建構器(如 EF Core、Dapper、Hibernate、Knex)由框架自動轉譯。
  • 若需手寫通用 SQL,可定義資料庫專用 View/Function 封裝,應用層統一呼叫 dbo.fn_Substr(str, pos, len),內部對應各平台語法。
  • 測試階段建立跨平台回歸測試資料集,驗證邊界值(0、負數、超長、NULL)。

結語

SUBSTR/SUBSTRING 雖是最基礎的字串函數,卻因歷史演進導致跨平台差異最大。記住「**SQL Server 必填長度、負數不支援、1-based 起算**」三鐵律,搭配上表快速查閱,即可在多資料庫環境下寫出正確、可移植的字串擷取邏輯。

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