DB2 ORACLE SQL寫法的主要區別

2021-12-29 23:49:38 字數 3438 閱讀 5281

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...