一、字符串处理函数
SQL Server 函数 | SQL Server 实例 | Oracle 函数 | Oracle 实例 | 输出结果 |
---|---|---|---|---|
CONCAT |
SELECT CONCAT('A', 'B', 'C'); |
CONCAT |
SELECT CONCAT('A', 'B') FROM DUAL; |
ABC (SQL) AB (Oracle) |
SUBSTRING |
SELECT SUBSTRING('Hello', 2, 3); |
SUBSTR |
SELECT SUBSTR('Hello', 2, 3) FROM DUAL; |
ell |
CHARINDEX |
SELECT CHARINDEX('@', '[email protected]'); |
INSTR |
SELECT INSTR('[email protected]', '@') FROM DUAL; |
5 |
REPLACE |
SELECT REPLACE('2023-01', '-', '/'); |
REPLACE |
SELECT REPLACE('2023-01', '-', '/') FROM DUAL; |
2023/01 |
LEN |
SELECT LEN('SQL Server'); |
LENGTH |
SELECT LENGTH('Oracle') FROM DUAL; |
10 (SQL) 6 (Oracle) |
二、数值计算函数
SQL Server 函数 | SQL Server 实例 | Oracle 函数 | Oracle 实例 | 输出结果 |
---|---|---|---|---|
ROUND |
SELECT ROUND(123.4567, 2); |
ROUND |
SELECT ROUND(123.4567, 2) FROM DUAL; |
123.4600 (SQL) 123.46 (Oracle) |
CEILING |
SELECT CEILING(3.2); |
CEIL |
SELECT CEIL(3.2) FROM DUAL; |
4 |
FLOOR |
SELECT FLOOR(3.8); |
FLOOR |
SELECT FLOOR(3.8) FROM DUAL; |
3 |
ABS |
SELECT ABS(-15.5); |
ABS |
SELECT ABS(-15.5) FROM DUAL; |
15.5 |
RAND |
SELECT RAND(); |
DBMS_RANDOM.VALUE |
SELECT DBMS_RANDOM.VALUE(0,1) FROM DUAL; |
0.7634 (示例) |
三、日期与时间函数
SQL Server 函数 | SQL Server 实例 | Oracle 函数 | Oracle 实例 | 输出结果 |
---|---|---|---|---|
GETDATE() |
SELECT GETDATE(); |
SYSDATE |
SELECT SYSDATE FROM DUAL; |
2025-05-17 14:30:45 |
DATEADD |
SELECT DATEADD(MONTH, 3, '2025-05-17'); |
ADD_MONTHS |
SELECT ADD_MONTHS(SYSDATE, 3) FROM DUAL; |
2025-08-17 |
DATEDIFF |
SELECT DATEDIFF(DAY, '2025-01-01', '2025-05-17'); |
日期直接相减 | SELECT (SYSDATE - TO_DATE('2025-01-01','YYYY-MM-DD')) FROM DUAL; |
136 (天数差) |
FORMAT |
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd'); |
TO_CHAR |
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL; |
2025-05-17 |
四、逻辑与条件函数
SQL Server 函数 | SQL Server 实例 | Oracle 函数 | Oracle 实例 | 输出结果 |
---|---|---|---|---|
ISNULL |
SELECT ISNULL(NULL, 'Default'); |
NVL |
SELECT NVL(NULL, 'Default') FROM DUAL; |
Default |
COALESCE |
SELECT COALESCE(NULL, NULL, 'Value'); |
COALESCE |
SELECT COALESCE(NULL, NULL, 'Value') FROM DUAL; |
Value |
CASE |
SELECT CASE WHEN 10 > 5 THEN 'Yes' ELSE 'No' END; |
CASE |
SELECT CASE WHEN 10 > 5 THEN 'Yes' ELSE 'No' END FROM DUAL; |
Yes |
IIF |
SELECT IIF(10 > 5, 'True', 'False'); |
DECODE |
SELECT DECODE(10, 5, 'False', 'True') FROM DUAL; |
True |
五、聚合与窗口函数
SQL Server 函数 | SQL Server 实例 | Oracle 函数 | Oracle 实例 | 输出结果 |
---|---|---|---|---|
SUM |
SELECT SUM(Sales) FROM Orders; |
SUM |
SELECT SUM(Sales) FROM Orders; |
15000.00 (示例) |
ROW_NUMBER |
SELECT ROW_NUMBER() OVER (ORDER BY Sales DESC); |
ROW_NUMBER |
SELECT ROW_NUMBER() OVER (ORDER BY Sales DESC) FROM Orders; |
生成行号序列 |
STRING_AGG |
SELECT STRING_AGG(Name, ',') FROM Employees; |
LISTAGG |
SELECT LISTAGG(Name, ',') WITHIN GROUP (ORDER BY Name) FROM Employees; |
Alice,Bob,Charlie |
注意事项
-
语法差异:
-
SQL Server 使用
SUBSTRING
,Oracle 使用SUBSTR
(参数顺序一致)。 -
Oracle 的
CONCAT
仅支持两个参数,需嵌套调用拼接多个值(如CONCAT(CONCAT('A', 'B'), 'C')
)。
-
-
日期处理灵活性:
- Oracle 允许直接对日期进行加减运算(如
SYSDATE + 1
表示加一天),而 SQL Server 需使用DATEADD
。
- Oracle 允许直接对日期进行加减运算(如
-
空值处理:
- SQL Server 的
ISNULL
对应 Oracle 的NVL
,但COALESCE
在两者中行为一致。
- SQL Server 的
-
版本兼容性:
- SQL Server 的
STRING_AGG
需 2017+ 版本,Oracle 的LISTAGG
需 11g R2+ 版本。
- SQL Server 的