Oracle中模拟SQL中的isnull函数

程序从MS SQL移植到ORACLE,面临大面积的SQL语句修改,其中用的最多的莫非isnull,虽然oracle中有nvl ,nullif, is null等函数,但却没有isnull。自己写一个吧,但是因为类似ISNULL(),NVL()的函数入参和返回值的数据类型都并不

复制代码
--创建isnull函数
create or replace function isnull(i_obj in varchar2, i_obj2 in varchar2)
return varchar2
is
begin
  return nvl(i_obj, i_obj2);
end isnull;
 
--测试建表语句
CREATE TABLE tUsers(
     UserName VARCHAR2(10),
          AGE NUMBER,
        stime date
 ); 
 
--插入测试数据 
 INSERT INTO tUsers(UserName,age) VALUES(null,22);
 INSERT INTO tUsers(UserName,age,stime)VALUES('你好123',18,SYSDATE);
 INSERT INTO tUsers(UserName,age) VALUES(null,26);
 INSERT INTO tUsers(UserName,age,stime)VALUES('好123',38,SYSDATE);
 INSERT INTO tUsers(UserName,age) VALUES(null,24);
 INSERT INTO tUsers(UserName,age,stime)VALUES('你123',28,SYSDATE);
 
 --查看建的表结构
 SELECT table_name, column_name, data_type,DATA_LENGTH,COLUMN_ID FROM USER_TAB_COLUMNS WHERE table_name =upper('tusers')
--查看测试数据
select * from tUsers
 
 --测试语句
 select * from tUsers where isnull(age,0)=0  --查询所有age字段为null的记录,成功!
 select username,isnull(age,0),stime from tUsers  --如果age字段为Null则返回number型0,成功!
 select username,isnull(age,'未知年纪'),stime from tUsers  --如果age字段为Null则返回VARCHAR型'未知年纪',成功!
 select username,age,isnull(stime,'未知时间') from tUsers  --如果stime字段为Null则返回VARCHAR型'未知时间',成功!
 --如果stime字段为Null则返回VARCHAR型'未知时间',否则返回格式化后的stime, 成功!
 select username,age,case when isnull(stime,' ')=' ' then '未知时间' else to_char(stime,'yyyy-mm-dd hh24:mi:ss') end as sstime from tUsers 
 --如果stime字段为Null则返回VARCHAR型'未知时间',否则返回stime,不成功!
 select username,age,case when isnull(stime,' ')=' ' then '未知时间' else stime end as sstime from tUsers  
 select username,age,nvl(stime,'未知时间') from tUsers  --NVL判断如果stime字段为Null则返回VARCHAR型'未知时间',不成功!
 
--删除测试表和数据
DROP TABLE tusers;
复制代码

通过测试数据可以看出,自定义isnull函数入参定义为varchar2类型, 基本常用的数据类型都可以实现隐式转换,其中包括varchar,varchar2,nvarchar2,number,date等。

确定,要如何定义类型?姑且用varchar2吧:请看下面测试代码

posted on   癫狂编程  阅读(1334)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示