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吧:請看下面測試代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM