将Oracle(大型网站数据库平台)迁移到DB2上,SQL会有些变化,下面让我们来具体看一下:
1、Oracel中的decode
DB2解决方案:用case条件表达式完成。
case两种语法模式:
(1)CASE
WHEN 条件 THEN 结果1
ELSE 结果2
END
(2)CASE 表达式1
WHEN 表达式2 THEN 结果1
ELSE 结果2
END
上面的WHEN可以重复多次,就像C中的SWITCH ..CASE的表达.
例如:
SELECT ORDNO,CUSNO,
CASE MONTH(SHIPDATE)
WHEN ''01'' THEN ''Jan''
WHEN ''02'' THEN ''Feb''
WHEN ''03'' THEN ''Mar''
WHEN ''04'' THEN ''Apr''
WHEN ''05'' THEN ''May''
WHEN ''06'' THEN ''Jun''
WHEN ''07'' THEN ''Jul''
WHEN ''08'' THEN ''Aug''
WHEN ''09'' THEN ''Sep''
WHEN ''10'' THEN ''Oct''
WHEN ''11'' THEN ''Nov''
WHEN ''12'' THEN ''Dec''
END
FROM FILE
应用实例:
Oracle(大型网站数据库平台) SQL:
-------------------------
select decode(t.organtypecode, ''D'', t.parent, ''S'', t.parent, t.id)
from A_ORGAN t
where t.parent = 35
DB2 SQL:
-------------------------
select case x.organtypecode
when ''D'' then
x.parent
when ''S'' then
x.parent
else
x.id
end
from a_Organ x
where x.parent = 35;
2、Oracle(大型网站数据库平台)中的Start with...Connect By递归查询
DB2解决方案:用with公共递归表达式来解决。
DB2解决方案:用case条件表达式完成。
Oracle(大型网站数据库平台) SQL:
-------------------
select t.id
from a_organ t
start with t.id in (select decode(t.organtypecode,
''D'',
t.parent,
''S'',
t.parent,
t.id)
from A_ORGAN
where t.id = 35)
connect by t.parent = prior t.id
DB2 SQL:
-------------------------
WITH FKK(id) as
(select o.id from a_organ o
where o.id=35
UNION ALL
select case x.organtypecode
when ''D'' then x.parent
when ''S'' then x.parent
else x.id
end
from FKK fk, a_organ x
where fk.id=x.parent)
select distinct id from FKK;
3、Oracle(大型网站数据库平台)中的dual表对应DB2中的SYSIBM.SYSDUMMY1表
DB2解决方案:对应于DB2中的 SYSIBM.SYSDUMMY1表
Oracle(大型网站数据库平台) SQL:
-------------------------
select 15 as ttt from dual
结果:
ttt
-------
15
DB2 SQL:
-------------------------
select 15 as ttt from SYSIBM.SYSDUMMY1
结果:
ttt
-------
15
4、日期转换问题
DB2解决方案:有相应的函数
Oracle(大型网站数据库平台) SQL:
-------------------------
select m.*
from dj_mcdj m
where m.mcqc || '' '' like ''%$P%''
and m.xzqhdm || '' '' like ''%$P%''
and m.hylbdm || '' '' like ''%$P%''
and m.blqsrq >= to_date(''$P'', ''yyyy-mm-dd'')
and m.blqsrq < to_date(''$P'', ''yyyy-mm-dd'')+1
DB2 SQL:
---------------------
--------------------
--名称:名称库查询
--作者:雷智民
--日期:2006-10-27
--FOR :DB2
--------------------
select m.*
from dj_mcdj m
where m.mcqc || '' '' like ''%%''
and m.xzqhdm || '' '' like ''%%%''
and m.hylbdm || '' '' like ''%%%''
and date(m.blqsrq) >= date(''1900-01-01'')
and date(m.blqsrq) < date(''2050-01-01'')+1 day
5、nvl 问题
DB2解决方案:利用coalesce(,) 或 value(,)方法。
Oracle(大型网站数据库平台)中的nvl对应db2中的value ,只是Oracle(大型网站数据库平台)中的语法更有宽松一些,在db2中,value要求两个参数必须是同一种类型的,nvl要求则不是很严格,nvl(A,‘’),如果A是数字类型或者日期类型的这个表达式也没有 问题,但是在db2中,若是也这么写的话, value(A,''),那肯定就有问题了,总的来说,基本上是一致的。
6、左右外连接问题
db2的左右外连接的语法和标准sql语法一样,只是没有Oracle(大型网站数据库平台)中的(+)这个简单符号来标记左右外连接,left (right) outer join on
1).内连接INNER JOIN的Oracle(大型网站数据库平台)和DB2的写法
Oracle(大型网站数据库平台)可以这样实现? Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no; DB2 可以这样实现? Select * from db2admin.bsempms inner join db2admin.bsdptms on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;
2).外连接的Oracle(大型网站数据库平台)和DB2的写法(右外连接,左外连接,完全外连接,组合外连接)
Oracle(大型网站数据库平台)可以这样实现?
Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no(+);
Select a.* from bsempms a,bsdptms b wherea.dpt_no(+)=b.dpt_no;
DB2 可以这样实现?
Select * from db2admin.bsempms right outer join db2admin.bsdptms
on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;
Select * from db2admin.bsempms left outer join db2admin.bsdptms
on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;
Select * from db2admin.bsempms full outer join db2admin.bsdptms
on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;
7、LIKE问题
db2中谓词LIKE后边的表达式不支持字段。只支持一下类型:
A constant
A special register
A host variable
A scalar function whose operands are any of the above
An expression concatenating any of the above
(附DB2文档:
使用格式: match-expression LIKE pattern-expression
match-expression
An expression that specifies the string that is to be examined to see if it conforms to a certain pattern of characters.
The expression can be specified by:
A constant
A special register
A host variable (including a locator variable or a file reference variable)
A scalar function
A large object locator
A column name
An expression concatenating any of the above
pattern-expression
An expression that specifies the string that is to be matched.
The expression can be specified by:
A constant
A special register
A host variable
A scalar function whose operands are any of the above
An expression concatenating any of the above
with the following restrictions:
No element in the expression can be of type LONG VARCHAR, CLOB, LONG VARGRAPHIC, or DBCLOB. In addition it cannot be a BLOB file reference variable.
The actual length of pattern-expression cannot be more than 32 672 bytes.
)
DB2中几个隔离级别select..for update with ** 的行锁
看了很多介绍DB2中隔离级别和锁的各种用法和机制,动手做了一个比较详尽的试验,
对于有些结果我还真没想明白。。
在 db2 9 中我做了以下的试验,
Create table RRTest (pkID VARCHAR(20) NOT NULL ,unID1 varchar(20) Not NULL,UnID2 varchar(20) ,"CUSTOMER_ID" VARCHAR(6) ,
"ORDER_TYPE" DECIMAL(2,0) ,
"EXECUTION_TYPE" DECIMAL(2,0) ,
"ORDER_DATE" VARCHAR(8) ,
"ORDER_TIME" VARCHAR(6) ,
"ORDER_DATETIME" TIMESTAMP ,
"SIDE" DECIMAL(1,0) ,
"TRADE_TYPE" DECIMAL(1,0) ,
"ORDER_AMOUNT" DECIMAL(15,2) ,
"ORDER_PRICE" DECIMAL(8,4),
TSID varchar(20) )
insert into RRTest
SELECT Order_ID, Order_ID, Order_ID, CUSTOMER_ID, ORDER_TYPE, EXECUTION_TYPE, ORDER_DATE, ORDER_TIME, ORDER_DATETIME, SIDE, TRADE_TYPE, ORDER_AMOUNT, ORDER_PRICE ,ORDER_ID
FROM DB2INST1.Fx_Order where ORDER_DATE >'20070401'
GO
select count(