DB2 ORACLE SQL寫法的主要區別

2021-06-16 14:49:09 字數 3310 閱讀 9335

from:

說實話,oracle把國內的程式設計師慣壞了,**中的sql充斥著大量oracle特性,幾乎沒人知道ansi的標準sql是什麼樣子,導致程式脫離了oracle根本無法執行,還好隨著hibernate的流行,情況有了很大改觀

1、資料型別轉換函式

整型轉字元型

字串轉整形

字串轉浮點型

浮點型轉字串

字串轉日期

字串轉時間戳

日期轉字串

oracle

to_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寫法的主要區別

說實話,oracle把國內的程式設計師慣壞了,中的sql充斥著大量oracle特性,幾乎沒人知道ansi的標準sql是什麼樣子,導致程式脫離了oracle根本無法執行,還好隨著hibernate的流行,情況有了很大改觀 1 資料型別轉換函式 整型轉字元型 字串轉整形 字串轉浮點型 浮點型轉字串 字串...

DB2 ORACLE SQL寫法的主要區別

db2 oracle sql寫法的主要區別 說實話,oracle把國內的程式設計師慣壞了,中的sql充斥著大量oracle特性,幾乎沒人知道ansi的標準sql是什麼樣子,導致程式脫離了oracle根本無法執行,還好隨著hibernate的流行,情況有了很大改觀 db2作為眾多國際大客戶的選擇 據說...

Oracle SQL和DB2分頁查詢寫法介紹

db2分頁查詢和oracle sql中的分頁查詢語句寫法都不太一樣,下面就為您介紹db2分頁查詢和其他資料庫中分頁查詢的區別,希望對您有所幫助。oracle分頁查詢寫法 一 oracle select from select rownum,name from table where rownum e...