nvl()与is null

本文介绍了Oracle SQL中的NVL与NVL2函数的用法及注意事项,包括如何处理NULL值,以及如何在查询中设定默认值。通过具体示例展示了函数的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select * from t_ACDM_FLOW_INFO t where t.FATHER_ID is null and nvl(t.old_tache_id,t.tache_id)='3' and t.USER_ID='2';

 

NVL( string1, replace_with)

  功能:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数的都为NULL ,则返回NULL。

  注意事项:string1和replace_with必须为同一数据类型,除非显示的使用TO_CHAR函数。

  例:NVL(TO_CHAR(numeric_column), 'some string') 其中numeric_column代指某个数字类型的值。

  例:nvl(yanlei777,0) > 0

  NVL(yanlei777, 0) 的意思是 如果 yanlei777 是NULL, 则取 0值

  通过查询获得某个字段的合计值,如果这个值为null将给出一个预设的默认值

NVL的扩展-NVL2

  Oracle在NVL函数的功能上扩展,提供了NVL2函数。

  NVL2(E1, E2, E3)的功能为:如果E1为NULL,则函数返回E3,否则返回E2。

http://baike.baidu.com/view/1091825.htm

<think>嗯,用户之前问过主外键表的数据插入和更新顺序,现在又问SQL Server和Oracle在SQL语句上的区别,比如ISNULLNVL。看来他们对数据库操作有实际需求,可能是在开发或维护中遇到了跨数据库的问题。需要详细对比两者的不同函数和语法,尤其是常用的函数和操作。 首先,用户提到的ISNULLNVL,这两个函数功能类似,但属于不同的数据库。SQL Server用ISNULL,而OracleNVL。需要明确说明这一点,并给出示例。 接下来,用户可能想知道更多类似的函数差异,比如日期处理、字符串连接、分页查询等。这些是常见的区别点,开发者在跨平台迁移或维护时经常会遇到。比如SQL Server用GETDATE()Oracle用SYSDATE;分页方面SQL Server用OFFSET-FETCH,Oracle用ROWNUM或ROW_NUMBER()。 还要考虑语法结构的不同,比如变量声明、存储过程的编写方式,以及事务处理语句。这些差异可能影响用户的代码迁移或跨数据库兼容性。 另外,用户可能没有明确提到的隐式类型转换、引号处理等细节问题,这些也是需要注意的地方,避免在实际使用中出现错误。 需要组织内容,分点说明,对比两者的差异,并给出示例,让用户一目了然。同时,补充注意事项,帮助用户在实际操作中避免常见陷阱。最后,总结关键点,便于用户快速参考。</think>--- ### **SQL Server Oracle 在 SQL 语句上的主要区别** SQL Server 和 Oracle 虽然都遵循 SQL 标准,但在语法、函数和特性上存在差异。以下是常见区别的对比(包括 `ISNULL` `NVL`): --- #### **1. 空值处理函数** - **SQL Server**:使用 **`ISNULL(expression, replacement)`** ```sql SELECT ISNULL(column_name, '默认值') FROM table; -- 若 column_name 为 NULL,返回 '默认值' ``` - **Oracle**:使用 **`NVL(expression, replacement)`** ```sql SELECT NVL(column_name, '默认值') FROM table; -- 功能 ISNULL 相同 ``` **注意**: - Oracle 还支持 `COALESCE(expr1, expr2, ...)`, `NVL` 类似但更灵活。 - SQL Server 的 `ISNULL` 仅支持两个参数,而 `COALESCE` 支持多参数。 --- #### **2. 字符串拼接** - **SQL Server**:使用 **`+`** 或 **`CONCAT()`** ```sql SELECT 'Name: ' + name FROM table; -- 或 SELECT CONCAT('Name: ', name) FROM table; ``` - **Oracle**:使用 **`||`** 或 **`CONCAT()`** ```sql SELECT 'Name: ' || name FROM table; -- 或(CONCAT 仅支持两个参数) SELECT CONCAT('Name: ', name) FROM table; ``` --- #### **3. 日期和时间函数** - **获取当前时间**: - SQL Server:`GETDATE()` 或 `SYSDATETIME()` ```sql SELECT GETDATE(); ``` - Oracle:`SYSDATE` 或 `CURRENT_TIMESTAMP` ```sql SELECT SYSDATE FROM dual; ``` - **日期格式化**: - SQL Server:`CONVERT()` 或 `FORMAT()` ```sql SELECT CONVERT(VARCHAR, GETDATE(), 112); -- 格式化为 'YYYYMMDD' ``` - Oracle:`TO_CHAR()` ```sql SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') FROM dual; ``` --- #### **4. 分页查询** - **SQL Server**:使用 **`OFFSET ... FETCH`**(2012+版本支持) ```sql SELECT * FROM table ORDER BY column OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY; ``` - **Oracle**:使用 **`ROWNUM`** 或 **`ROW_NUMBER()`** ```sql -- 使用 ROWNUM(旧方法) SELECT * FROM ( SELECT t.*, ROWNUM rn FROM table t WHERE ROWNUM <= 15 ) WHERE rn > 10; -- 使用 ROW_NUMBER()(推荐) SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER (ORDER BY column) rn FROM table t ) WHERE rn BETWEEN 11 AND 15; ``` --- #### **5. 条件判断函数** - **SQL Server**:`CASE WHEN ... THEN ... END` 或 **`IIF()`** ```sql SELECT IIF(score >= 60, '及格', '不及格') FROM students; ``` - **Oracle**:`CASE WHEN ... THEN ... END` 或 **`DECODE()`** ```sql SELECT DECODE(score, 60, '及格', '不及格') FROM students; -- DECODE 是 Oracle 特有函数,功能类似简单 CASE ``` --- #### **6. 其他常见差异** | **功能** | **SQL Server** | **Oracle** | |--|-------------------------------|-------------------------------| | **自增列** | `IDENTITY(1,1)` | 使用序列(`SEQUENCE`)+ 触发器 | | **表别名** | 支持 `AS` 或直接写别名 | 必须省略 `AS`(直接写别名) | | **隐式类型转换** | 较宽松(如字符串转数字) | 较严格,常需显式转换(如 `TO_NUMBER`) | | **存储过程** | `CREATE PROCEDURE` + `BEGIN...END` | `CREATE OR REPLACE PROCEDURE` + `IS...BEGIN...END` | | **事务控制** | `BEGIN TRANSACTION` + `COMMIT` | 自动提交默认关闭,需显式 `COMMIT` | | **引号处理** | 字符串用单引号(`'value'`) | 字符串用单引号,双引号用于对象名(`"ColumnName"`) | --- ### **注意事项** 1. **函数兼容性**: - 若需跨数据库兼容,尽量使用标准 SQL 语法(如 `COALESCE` 替代 `ISNULL/NVL`)。 - 避免使用数据库特有的函数(如 `DECODE` 或 `IIF`)。 2. **分页查询**: - SQL Server 的 `OFFSET-FETCH` 语法更简洁,而 Oracle 需依赖子查询或 `ROW_NUMBER()`。 3. **日期处理**: - Oracle 的日期包含时分秒,而 SQL Server 的 `GETDATE()` 返回精度到毫秒。 4. **性能差异**: - Oracle 对复杂查询优化较强,SQL Server 在 OLTP 场景下更高效(因架构设计不同)。 -- ### **总结** | **功能** | **SQL Server** | **Oracle** | |--|---------------------| | 空值处理 | `ISNULL` | `NVL` | | 字符串拼接 | `+` 或 `CONCAT` | `||` 或 `CONCAT` | | 分页查询 | `OFFSET-FETCH` | `ROWNUM`/`ROW_NUMBER` | | 条件判断 | `IIF` | `DECODE` | | 日期函数 | `GETDATE()` | `SYSDATE` | **核心建议**:根据实际数据库环境调整语法,并在迁移时充分测试兼容性!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值