db2、oracle sql寫法的主要區別
說實話,oracle把國內的程式設計師慣壞了,**中的sql充斥著大量oracle特性,幾乎沒人知道ansi的標準sql是什麼樣子,導致程式脫離了oracle根本無法執行,還好隨著hibernate的流行,情況有了很大改觀
db2作為眾多國際大客戶的選擇(據說世界500強80%用db2,前100強更是全部採用db2),在國內真的很不流行,屬於小眾資料庫,但是沒辦法,現在的專案要用db2,所以不得不面對熟悉oracle的開發同事們寫出的「oracle版**」,眾多的相容性問題搞得很是頭大,遂整理了乙份經常遇到的相容性問題列表供大家參考,貌似最近問題少了些,但願這個勢頭能繼續下去
1、資料型別轉換函式
整型轉字元型
字串轉整形
字串轉浮點型
浮點型轉字串
字串轉日期
字串轉時間戳 日期
轉字串
orato_char(1)
to_number
('1')
to_number
('1.1')
to_char
(1.1)
to_date
('2007-04-26','yyyy-mm-dd')
to_date('2007-04-26 08:08:08','yyyy-mm-dd hh24:mi:ss')
to_char
(to_date('2007-04-29','yyyy-mm-dd'),'yyyy-mm-dd')
db2char(1)
int('1')
double
('1.1')
char(1.1)
date
('2007-04-26')
to_date('2007-04-26 08:08:08','yyyy-mm-dd hh24:mi:ss')
char
(date('2007-04-29'))
相容寫法
cast
(1 as char)
cast
('1' as int) 無
無 無相容 無
2、where條件弱型別判斷
oracle: where 字元型字段 in (整形) 是允許,db2不允許
select 'abc' from dual where '1' in (1) 在oracle下可通過
select 'abc' from sysibm.sysdummy1 where '1' in (1) 在db2下報錯
oracle:where 字元型字段=數字型字段 允許,db2不允許
select 'abc' from dual where '1'=1 在oracle下可通過
select 'abc' from sysibm.sysdummy1 whre '1'=1 在db2下報錯
3、replace關鍵字
oracle支援,db2不支援 create or replace語句在db2下是非法的
4、子查詢別名
oracle 支援select * from(select 1 from dual) 或者 select * from(select 1 from dual) t
db2 支援select * from(select 1 from sysibm.sysdummy1) t 或者 select * from(select 1 from sysibm.sysdummy1) as t
固相容的寫法是select * from(子查詢) t
5、date資料型別的區別
oracle中date型也是帶有時分秒的,但db2下date只是年月日,如'2007-04-28',且可作為字串直接操作,db2中要記錄時分秒必須採用timestamp型
乙個採用hibernate後常見的相容問題是:
如果在對映檔案中定義了某個欄位為date型
則在db2下,此欄位必須定義為timestamp,而不能定義成date,不然會報出字串右截斷的錯誤
對於db2來說,在查詢條件 中可以直接用字串指定日期或時間戳型別欄位的值,例如 where create_date = '2007-04-26' 、where create_timestamp = '2007-04-26 08:08:08' ,無須使用字串轉日期函式
6、分頁的處理
如果採用jdbc分頁的話,注意rownum在db2中不受支援,比如從masa_area表中取得area_id最小的10條記錄,語句分別如下,注意這裡的別名t書寫方法
oracle: select t.* from (select rownum as r1 ,masa_area.* from masa_area order by area_id) t where t.r1<=10
db2: select t.* from (select rownumber() over() as r1 ,masa_area.* from masa_area order by area_id) t where t.r1<=10
7、decode函式
decode函式在db2不被支援,相容的寫法是採用case when
8、nvl函式
nvl寫法在db2不被支援,相容的寫法是採用coalesce
oracle: select nvl(f_areaid,'空') from masa_user 等同於 select coalesce(f_areaid,'空',f_areaid) from masa_user
db2: select coalesce(f_areaid,'空',f_areaid) from masa_user
9、substr的不同
db2 substr舉例如下:
masa_group表的f_groupcode欄位定義成varchar(100),所以下面這個語句不會出錯,如果是substr(f_groupcode,1,101)就出錯了
select * from masa_group where substr(f_groupcode,1,50) = '001006' order by f_groupcode
在db2下無錯,但是
select * from masa_group where substr('001006', 1, 50) = '001006' order by f_groupcode
就報錯,說第三個引數超限
這是因為'001006'已經定義為乙個長度為6的charater了
這點和oracle有很大不同,請大家注意
如果是要從第一位取到最後一位,穩妥的辦法是不要加第三個引數
oracle:select substr('123456',1) from dual
db2:select substr('123456',1) from sysibm.sysdummy1
都沒有問題
10、獲取作業系統當前日期
oracle sysdate
db2 current date
DB2 ORACLE SQL寫法的主要區別
from 說實話,oracle把國內的程式設計師慣壞了,中的sql充斥著大量oracle特性,幾乎沒人知道ansi的標準sql是什麼樣子,導致程式脫離了oracle根本無法執行,還好隨著hibernate的流行,情況有了很大改觀 1 資料型別轉換函式 整型轉字元型 字串轉整形 字串轉浮點型 浮點型轉...
DB2 ORACLE SQL寫法的主要區別
說實話,oracle把國內的程式設計師慣壞了,中的sql充斥著大量oracle特性,幾乎沒人知道ansi的標準sql是什麼樣子,導致程式脫離了oracle根本無法執行,還好隨著hibernate的流行,情況有了很大改觀 1 資料型別轉換函式 整型轉字元型 字串轉整形 字串轉浮點型 浮點型轉字串 字串...
Oracle SQL和DB2分頁查詢寫法介紹
db2分頁查詢和oracle sql中的分頁查詢語句寫法都不太一樣,下面就為您介紹db2分頁查詢和其他資料庫中分頁查詢的區別,希望對您有所幫助。oracle分頁查詢寫法 一 oracle select from select rownum,name from table where rownum e...