ORACLE查询程序的where部分可以使用case用when还是where when加substr加日期转换函数吗

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

DB2解决方案:用case用when还是where条件表达式唍成

case用when还是where两种语法模式:

DB2解决方案:用with公共递归表达式来解决。

DB2解决方案:用case用when还是where条件表达式完成

DB2解决方案:有相应的函数

oracle中的nvl對应db2中的value ,只是oracle中的语法更有宽松一些在db2中,value要求两个参数必须是同一种类型的nvl要求则不是很严格,nvl(A,‘’)如果A是数字类型或者日期類型的这个表达式也没有 问题,但是在db2中若是也这么写的话, value(A,''),那肯定就有问题了总的来说,基本上是一致的

2).外连接的Oracle和DB2的写法(右外连接,左外连接,完全外连接,组合外连接)

  Oracle可以这样实现?

  DB2 可以这样实现?

db2中谓词LIKE后边的表达式不支持字段。只支持一下类型:

看了很多介绍DB2中隔离级别和锁的各种用法和机制动手做了一个比较详尽的试验,

对于有些结果我还真没想明白。

在 db2 9 中我做了以下的试验

按照以上字段 pkID 是主键,unID1 是唯一健索引unID2 是普通健索引,TSID 是普通字段没有在上建立索引。

WITH RR 锁行,不锁表 锁行,不锁表 不锁行,不锁表(1) 锁行,锁表

WITH RS 锁荇,不锁表 锁行,不锁表 锁行,不锁表 锁行,锁表(2)

锁行是指在一个事务中用某种方式读取并更改了改行数据并显示得指明要修改后这个事务将锁住改行,直到它提交或者回滚了事务后才释放该锁。

锁表是指在用以上各种SQL在读取并更改一行的同时锁住了整个表

对以上红字部分(1)可能有不能理解的是:为什么对普通索引和主键或者唯一健索引的不同结论? 

 对 PK和UNIQ的解释是因为RR 是可重复的读的级别,对这次检索扫描到嘚有可能成为自己的潜在检索对象的内容都会锁住而因为是主键或者唯一健,别的行不可能成为这次这个检索的潜在读的范围就是对別的数据此事务根本就没有必要锁,任何情况的更改都不可能出现幻读的情况(此表上的约束限制)所以只锁这一行。这么理解对PK,UNIQ没有问題

但是NormalINDEX 我认为应该是锁住这个表而不是不锁。这点一直没想明白留待以后再加强理解。

对 RS隔离级别是“锁定检索到的数据行”是通过SQL检索到的结果进行锁定, PK,UNIQ,INDEX的结论完全都可以理解 对 tableScan的检索而出现的锁表有些象RR隔离级别的所为。

嗯想了一圈没想明白,故把详细过程贴出来给自己留个纪念以供以后遇到此类并发控制程序中注意一下,select * From TTT where ****= ? for update with RR(RS)这里的 *** 可不是随便定义的。

隔离级别分为RR/RS/CS/UR这四个級别 下面让我们来逐一论述:

1. RR隔离级别: 在此隔离级别下, DB2会锁住所有相关的纪录 在一个SQL语句执行期间, 所有执行此语句扫描过的紀录都会被加上相应的锁 具体的锁的类型还是由操作的类型来决定, 如果是读取则加共享锁; 如果是更新, 则加独占锁 由于会锁定所有为获得SQL语句的结果而扫描的纪录, 所以锁的数量可能会很庞大 这个时候, 索引的增加可能会对SQL语句的执行有很大的影响因为索引會影响SQL语句扫描的纪录数量。

2. RS隔离级别: 此隔离级别的要求比RR隔离级别稍弱此隔离级别下会锁定所有符合条件的纪录。 不论是读取 還是更新, 如果SQL语句中包含查询条件 则会对所有符合条件的纪录加相应的锁。 如果没有条件语句 也就是对表中的所有记录进行处理,則会对所有的纪录加锁

3. CS隔离级别: 此隔离级别仅锁住当前处理的纪录。

4. UR隔离级别:此隔离级别下如果是读取操作,不会出现任何嘚行级锁对于非只读的操作,它的锁处理和CS相同

DB2默认的隔离级别是 CS。即 游标稳定性

1.“||”的字符连接问题

SQLSTATE=42884”的错误,原因是有非芓符类型参与了“||”运算如有变量或字段出现在“||”的运算中,解决办法是把变量或字段传给char()函数再参与运算就OK了下面举个例子:

在DB2Φ不能使用DATEDIFF函数,或者说是我的不能用那么怎么比较两个时间相差多少并返回以日、月或年等为时间单位的值呢?用timestampdiff()函数!例子:

--其中64表示返回以月为单位的值

那在DB2里应该怎么写才能实现这个查询啊?

3.like后面不能跟字段

如果仅仅是想写像上面那样的like可以用left或substr函数:


版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

原表是个员工档案,共583人但case用when还是where when结合group by用时,写法不同其出来的结果也不同

我要回帖

更多关于 case用when还是where 的文章

 

随机推荐