延續遷移系列,本文聚焦 **SELECT 列選擇語法**、**DUAL 表** 及 **字串連接運算子** 三大語法層面差異,這是改寫查詢時最先碰到的阻礙。
Oracle 要求 SELECT ... FROM table 必須有 FROM 子句,故內建單列單行 DUAL 表供純量運算:
-- Oracle
SELECT SYSDATE FROM DUAL;
SELECT 'Hello' FROM DUAL;
-- SQL Server (直接 SELECT 純量運算式)
SELECT GETDATE();
SELECT 'Hello';
遷移時**直接移除 FROM DUAL** 即可。
| Oracle | SQL Server | 備註 |
|---|---|---|
|| | + | SQL Server + 同時為數值相加與字串連接,隱性轉換優先數值,需注意 'A' + 1 報錯 |
CONCAT(str1, str2) | CONCAT(str1, str2) (2012+) | CONCAT 自動處理 NULL 轉空字串,建議統一使用 |
col AS alias、col alias。SELECT col1, col2 FROM (subquery) 子查詢不強制別名;SQL Server **衍生表必須有別名** SELECT col1 FROM (subquery) AS t。SELECT * 習慣同上,但生產環境建議**明確列出欄位**,避免結構變更導致應用報錯。| 項目 | Oracle | SQL Server |
|---|---|---|
| 分頁 | ROWNUM 子查詢 / OFFSET FETCH (12c+) | OFFSET n ROWS FETCH NEXT m ROWS ONLY (2012+) |
| MERGE (UPSERT) | MERGE INTO ... USING ... ON ... | 語法大同小異,注意 WHEN NOT MATCHED BY SOURCE |
| 序列/自增 | CREATE SEQUENCE / NEXTVAL | IDENTITY(1,1) / SEQUENCE (2012+) |
| 暫存表 | GLOBAL TEMPORARY TABLE | #temp (Session) / ##temp (Global) / Table Variable |