字串函數對照
| 功能 | Oracle | SQL Server |
| 字元編碼 | ASCII | ASCII |
| 編碼轉字元 | CHR | CHAR |
| 串接 | CONCAT / || | + |
| 搜尋位置 | INSTR | CHARINDEX / PATINDEX |
| 大小寫 | LOWER / UPPER | LOWER / UPPER |
| 左填充 | LPAD | N/A (REPLICATE + RIGHT) |
| 修剪空白 | LTRIM / RTRIM | LTRIM / RTRIM |
| 重複字串 | RPAD | REPLICATE |
| 同音代碼 | SOUNDEX | SOUNDEX |
| 子字串 | SUBSTR | SUBSTRING |
| 替換 | REPLACE | STUFF / REPLACE |
| 首字大寫 | INITCAP | N/A |
| 字元轉換 | TRANSLATE | N/A |
| 長度 | LENGTH | LEN / DATALENGTH |
| 最大/最小字串 | GREATEST / LEAST | N/A |
| NULL 替換 | NVL | ISNULL / COALESCE |
日期函數對照
| 功能 | Oracle | SQL Server |
| 日期運算 | date ± n / ADD_MONTHS | DATEADD |
| 日期差值 | date - date / MONTHS_BETWEEN | DATEDIFF |
| 目前日期時間 | SYSDATE | GETDATE() |
| 月底日期 | LAST_DAY | N/A (EOMONTH 2012+) |
| 時區轉換 | NEW_TIME | N/A (AT TIME ZONE 2016+) |
| 下一個週幾 | NEXT_DAY | N/A |
| 日期轉字串 | TO_CHAR | DATENAME / CONVERT |
| 日期轉數值 | TO_NUMBER(TO_CHAR()) | DATEPART |
| 日期捨入 | ROUND | CONVERT |
| 日期截斷 | TRUNC | CONVERT |
| 字串轉日期 | TO_DATE | CONVERT / CAST |
| NULL 替換 | NVL | ISNULL |
轉換函數核心差異
SQL Server 單一 CONVERT/CAST 涵蓋 Oracle 多個 TO_* 函數:
| 轉換方向 | Oracle | SQL Server |
| 數字→字串 | TO_CHAR | CONVERT/CAST |
| 字串→數字 | TO_NUMBER | CONVERT/CAST |
| 日期→字串 | TO_CHAR | CONVERT/CAST (style 代碼) |
| 字串→日期 | TO_DATE | CONVERT/CAST (自動識別格式) |
| 16進位→二進位 | HEXTORAW | CONVERT |
| 二進位→16進位 | RAWTOHEX | CONVERT |
SQL Server CONVERT 透過 style 參數控制日期格式 (如 101=mm/dd/yyyy, 120=yyyy-mm-dd hh:mi:ss)。
條件邏輯:DECODE vs CASE
-- Oracle DECODE
DECODE(grade, 'A',4, 'B',3, 'C',2, 0)
-- SQL Server CASE (支援布林運算式)
CASE grade
WHEN 'A' THEN 4
WHEN 'B' THEN 3
WHEN 'C' THEN 2
ELSE 0
END
-- CASE 進階: 搜尋條件
CASE
WHEN sal > 5000 THEN 'High'
WHEN sal > 3000 THEN 'Mid'
ELSE 'Low'
END
使用者定義函數替代方案
Oracle PL/SQL 函數可直接在 SQL 呼叫;SQL Server 需改寫為 JOIN 子查詢或 APPLY:
-- Oracle: 直接呼叫函數
SELECT ssn, tuition_paid / GET_SUM_MAJOR(major) pct FROM student;
-- SQL Server: 使用衍生表/子查詢
SELECT s.ssn, s.tuition_paid / m.sum_major pct
FROM student s
JOIN (SELECT major, SUM(tuition_paid) sum_major FROM student GROUP BY major) m
ON s.major = m.major;
流程控制與變數差異
| 項目 | Oracle PL/SQL | SQL Server T-SQL |
| 變數宣告 | DECLARE v_name TYPE; | DECLARE @v_name TYPE; |
| 賦值 | v := 1; | SET @v = 1; |
| SELECT INTO | SELECT col INTO v FROM t; | SELECT @v = col FROM t; |
| IF/ELSE | IF ... THEN ... ELSIF ... END IF; | IF ... BEGIN ... END ELSE BEGIN ... END |
| 迴圈 | LOOP/WHILE/FOR | WHILE ... BEGIN ... END |
| 游標 | 支援 %TYPE, %ROWTYPE, FOR LOOP | DECLARE CURSOR, FETCH, @@FETCH_STATUS |
| 輸出訊息 | DBMS_OUTPUT.PUT_LINE | PRINT |
| 拋出錯誤 | RAISE_APPLICATION_ERROR | RAISERROR |
| 註解 | -- / /* */ | -- / /* */ |
游標關鍵差異
- Oracle:預設需游標,支援隱性/顯性、%ROWTYPE、FOR LOOP 自動管理
- SQL Server:預設結果集直回客戶端,僅需逐列處理時宣告游標
- T-SQL 游標支援
SCROLL (前後捲動)、INSENSITIVE (快照隔離)、DEALLOCATE 釋放資源
其他重要差異
- 字串串接:Oracle
|| vs SQL Server +
- NULL 比較:SQL Server 預設
ANSI_NULLS ON,NULL = NULL 為 UNKNOWN
- 模式比對:SQL Server 額外支援
[range]、[^range] 萬用字元
- 序列/身分識別欄:Oracle
SEQUENCE vs SQL Server IDENTITY